线程的3种实现方式并深入源码简单分析实现原理(1)

简介: 线程的3种实现方式并深入源码简单分析实现原理(1)

前言


本文介绍下线程的3种实现方式并深入源码简单的阐述下原理


三种实现方式


Thread


image.png


image.png


image.png



深入源码简单刨析


Thread


Thread类实现了Runnable接口


枚举类 State


JVM中的线程必须只能是以上6种状态的一种。这些状态是JVM状态并不能和操作系统线程状态互相映射


  • NEW


线程刚创建,还未执行(start方法)


  • RUNNABLE


已就绪可运行的状态。
处于此状态的线程是正在JVM中运行的,
但可能在等待操作系统级别的资源,例如CPU时间片



  • BLOCKED


阻塞等待监视器锁
处于此状态的线程正在阻塞等待监视器锁,
以进入一个同步块/方法,
或者在执行完wait()方法后重入同步块/方法


  • WAITING


等待
执行完Object.wait无超时参数操作,
或者 Thread.join无超时参数操作(进入等待指定的线程执行结束),
或者 LockSupport.park操作后,线程进入等待状态。
一般在等待状态的线程在等待其它线程执行特殊操作,
例如:等待另其它线程操作Object.notify()唤醒或者Object.notifyAll()唤醒所有。


  • TIMED_WAITING



限时等待
Thread.sleep、Object.wait带超时时间、
Thread.join带超时时间、
LockSupport.parkNanos、
LockSupport.parkUntil这些操作会时线程进入限时等待


  • TERMINATED


终止,线程执行完毕


线程状态流转


JVM 线程状态流转图


image.png


注意:不要混淆操作系统线程状态和java线程状态。JVM中的线程必须只能是以上6种状态的一种!RUNNABLE = 正在JVM中运行的(Running)+ 可能在等待操作系统级别的资源(Ready)例如CPU时间片


  • 线程创建之后,不会立即进入就绪状态,因为线程的运行需要一些条件(比如内存资源),


  • 只有线程运行需要的所有条件满足了,才进入就绪状态。


  • 当线程进入就绪状态后,不代表立刻就能获取CPU执行时间,也许此时CPU正在执行其他的事情,因此它要等待。


  • 当得到CPU执行时间之后,线程便真正进入运行状态。


  • 线程在运行状态过程中,可能有多个原因导致当前线程不继续运行下去,比如用户主动让线程睡眠(睡眠一定的时间之后再重新执行)、用户主动让线程等待,或者被同步块给阻塞,此时就对应着多个状态:time waiting(睡眠或等待一定的事件)、waiting(等待被唤醒)、blocked(阻塞)。


  • 当由于突然中断或者子任务执行完毕,线程就会被消亡。
相关文章
|
1月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
41 1
|
1月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
66 0
|
2月前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
143 29
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
2月前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
1月前
|
存储 运维 API
源码解密协程队列和线程队列的实现原理(一)
源码解密协程队列和线程队列的实现原理(一)
35 1
|
1月前
|
存储 安全 API
源码解密协程队列和线程队列的实现原理(二)
源码解密协程队列和线程队列的实现原理(二)
33 1
|
1月前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
38 1
|
2月前
|
并行计算 API 调度
探索Python中的并发编程:线程与进程的对比分析
【9月更文挑战第21天】本文深入探讨了Python中并发编程的核心概念,通过直观的代码示例和清晰的逻辑推理,引导读者理解线程与进程在解决并发问题时的不同应用场景。我们将从基础理论出发,逐步过渡到实际案例分析,旨在揭示Python并发模型的内在机制,并比较它们在执行效率、资源占用和适用场景方面的差异。文章不仅适合初学者构建并发编程的基础认识,同时也为有经验的开发者提供深度思考的视角。
|
3月前
|
存储 监控 Java
|
3月前
|
安全 Java 开发者
Swing 的线程安全分析
【8月更文挑战第22天】
61 4