【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。
相关文章
- Java 利用缓冲字节流来实现视频、音频、图片的复制粘贴
- Java多线程之线程协作
- Java多线程之线程同步
- Java 多线程编程
- java基础—几种for循环编程思想
- 【JAVA】条件判断语句合集(源代码实例,入门参考)
- Java多线程系列—线程的运行机制(02)
- JAVA线程池代码浅析
- 15个顶级Java多线程面试题及回答
- Java面试题:HashMap的原理
- 【运维】Centos 7 一键 搭建 Java开发者环境
- 《Java程序员面试秘笈》—— 1.10 线程局部变量的使用
- 从ConcurrentHashMap的演进看Java多线程核心技术
- (Java实习生)每日10道面试题打卡——Java多线程篇
- Java多线程编程
- java 声明多个泛型类型和通配符
- Java 多线程的创建
- Java 多线程通信 AsyncTask.executeOnExecutor并发深入解析
- Java多线程-线程的同步与锁
- 高级java必会系列二:多线程经常使用的3个关键字:synchronized、ReentrantLock、volatile
- java中HashMap在多线程环境下引起CPU100%的问题解决
- JAVA多线程X-mind
- Java的多线程机制
- Java的Socket网络编程以及多线程
- Java多线程共享数据、同步、通信
- Java程序员面试中的多线程问题
- java to edi 动态/静态映射
- 【Java】使用BigDecimal类进行精确小数计算
- Java多线程-简单使用Lock(锁)
- java多线程wait notify join
- Java 多线程七大状态