【Java多线程】线程状态、线程池状态
线程状态:
线程共包括以下5种状态。
1. 新建状态(New)
线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。
2. 就绪状态(Runnable)
也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。
例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。
3. 运行状态(Running)
线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
4. 阻塞状态(Blocked)
阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。
(02) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
(03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。
当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5. 死亡状态(Dead)
线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
线程池状态:
1. RUNNING
(01) 状态说明:线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。
(02) 状态切换:线程池的初始化状态是RUNNING。换句话说,线程池被一旦被创建,就处于RUNNING状态!
道理很简单,在ctl的初始化代码中(如下),就将它初始化为RUNNING状态,并且"任务数量"初始化为0。
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
2. SHUTDOWN
(01) 状态说明:线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务。
(02) 状态切换:调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWN。
3. STOP
(01) 状态说明:线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。
(02) 状态切换:调用线程池的shutdownNow()接口时,线程池由(RUNNING or SHUTDOWN ) -> STOP。
4. TIDYING
(01) 状态说明:当所有的任务已终止,ctl记录的"任务数量"为0,线程池会变为TIDYING状态。当线程池变为TIDYING状态时,会执行钩子函数terminated()。terminated()在ThreadPoolExecutor类中是空的,若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。
(02) 状态切换:当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。
当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。
5. TERMINATED
(01) 状态说明:线程池彻底终止,就变成TERMINATED状态。
(02) 状态切换:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。
最新文章
- 【uTenux】学习一个嵌入式操作系统-uTenux
- 做小图标还用sprite图?你out了!史上最简单易懂iconfont使用教程
- 错误:创建 cachingConfiguration 的配置节处理程序时出错: 未能加载文件或程序集“Microsoft.Practices.EnterpriseLibrary.Caching,
- JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)
- Objective-C ,C++,java中常用编码格式对比
- UI3_UIbarButtonItem
- 函数get_table_share
- HDU-4681 String 枚举+DP
- [Embed(source=";asset.swf";)] 使用其中的所有资源
- bootstrap之 formgroup表单布局样式
- js中的 arguments ,实参的集合
- JavaScript实现职责链模式
- SSH密钥认证添加方法和一些实用配置
- 数据库原理 - 序列4 - 事务是如何实现的? - Redo Log解析(续)
- 反射 day1
- idea打包springboot+maven项目并发布在linux上
- 选择困难症的福音——团队Scrum冲刺阶段-Day 3
- 光学定位点(mark点)
- 判断window.open的页面是否已经被关
- table thead 置顶
热门文章
- 【Elasticsearch全文搜索引擎实战】之Head插件实践
- Vue之项目搭建
- C# json反序列化 对象中嵌套数组 (转载)
- .net导出excle无需任何插件,直接通过一个tablehtml实现
- 用HTML,Vue+element-UI做桌面UI
- demo:动态生成专属二维码
- python练习(-)
- synchronized的锁问题
- NoSQL&;Redis
- [20171120]关于INBOUND_CONNECT_TIMEOUT设置.txt