线程的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(阻塞)。


  • 当由于突然中断或者子任务执行完毕,线程就会被消亡。
相关文章
|
2月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
220 1
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
7月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
7月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
8月前
|
Java 中间件 调度
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
293 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
291 1
|
11月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
825 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
292 0
|
9月前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
455 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
250 12

热门文章

最新文章