线程的5种状态

线程可以有如下5种状态:New 、Runnable 、Running 、Blocked 、Dead
状态之间的转换如图:

1.New (新创建)

当用new操作符创建一个线程时,如new Thread®,该线程还没有开始运行。这意外这它的状态是new。此时程序还没有开始运行线程中的代码,在线程运行之前还有一些基础工作要做。

2.Runnable (可运行/就绪)

一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。

处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序来调度的。

3.Running (运行中)

当线程获得CPU时间片,线程就进入Running状态(如图中的2所示)。
处于Running状态的线程有可能在运行中CPU时间片用完,而run方法没运行完,线程就又进入Runnable状态。
通常情况下,运行中的线程一直处于Running与Runnable交替转换的过程中。
  
4.Blocked (等待/阻塞/睡眠)

当线程在Running状态中,遇到阻塞等待锁、等待用户输入、调用sleep()方法、调用join等待其他线程情况,会导致线程进入阻塞状态(Blocked)。
处于阻塞状态的线程,在阻塞等待结束之后,会进入Runnable状态,等等获得CPU时间片继续运行程序。

线程运行过程中,可能由于各种原因进入阻塞状态:

  • 线程通过调用sleep方法进入睡眠状态;
  • 线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
  • 线程试图得到一个锁,而该锁正被其他线程持有;
  • 线程在等待某个触发条件;

5.Dead (死亡)

有两个原因会导致线程死亡:

  • run方法正常退出而自然死亡;
  • 一个未捕获的异常终止了run方法而使线程猝死;

为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法,如果是可运行或被阻塞,这个方法返回true;如果线程仍旧是new状态且不是可运行的,或者线程死亡了,则返回false。

线程池的五种状态

线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。

线程池各个状态切换框架图:

1.RUNNING

  • 状态说明:线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。
  • 状态切换:线程池的初始化状态是RUNNING。换句话说,线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0!
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

2.SHUTDOWN

  • 状态说明:线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务。
  • 状态切换:调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWN。

3.STOP

  • 状态说明:线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。
  • 状态切换:调用线程池的shutdownNow()接口时,线程池由(RUNNING or SHUTDOWN ) -> STOP。

4.TIDYING

  • 状态说明:当所有的任务已终止,ctl记录的”任务数量”为0,线程池会变为TIDYING状态。当线程池变为TIDYING状态时,会执行钩子函数terminated()。terminated()在ThreadPoolExecutor类中是空的,若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。
  • 状态切换:当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。
    当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。

5.TERMINATED

  • 状态说明:线程池彻底终止,就变成TERMINATED状态。
  • 状态切换:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。

线程及线程池的五种状态相关推荐

  1. 线程池的五种状态及创建线程池的几种方式

    上篇<Java线程的6种状态详解及创建线程的4种方式> 前言:我们都知道,线程是稀有资源,系统频繁创建会很大程度上影响服务器的使用效率,如果不加以限制,很容易就会把服务器资源耗尽.所以,我 ...

  2. Java并发编程一线程池的五种状态

    推荐:Java并发编程汇总 Java并发编程一线程池的五种状态 原文地址 Java多线程线程池(4)–线程池的五种状态 正文 线程池的5种状态:Running.ShutDown.Stop.Tidyin ...

  3. 线程池的五种状态详解

    线程池的5种状态:Running.ShutDown.Stop.Tidying.Terminated. 概述 最好的学习方式就是看源码,众所周知,创建线程池肯定会使用到ThreadPoolExecuto ...

  4. Java线程池--线程池的五种状态

    线程池的5种状态:Running.ShutDown.Stop.Tidying.Terminated. 线程池各个状态切换框架图: 1.RUNNING (1) 状态说明:线程池处在RUNNING状态时, ...

  5. ThreadPoolExecutor的参数与线程池的五个状态

    ThreadPoolExecutor,它是Executors.newXxxxx()的返回结果,像Executors.newCachedThreadPool();,它实际上是这个: public sta ...

  6. 线程的五种状态及状态的切换

    线程状态示意图 首先看下这张图,这张图标注了线程的五种状态,以及进程间的切换. 简述线程状态 新建状态 新建状态:新建了一个线程对象,该对象就处于新建状态. 就绪状态 就绪状态:线程对象创建后,其他线 ...

  7. 线程五种状态(新建、就绪、运行、阻塞、死亡)

    线程的5种状态: 每个 Java 程序都有一个缺省的主线程,对于 Java 应用程序,主线程是 main()方法执行的线索: 对于 Applet 程序,主线程是指挥浏览器加载并执行 Java Appl ...

  8. 线程的生命周期及五种基本状态介绍

    一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌 ...

  9. 关于线程池的五种实现方式,七大参数,四种拒绝策略

    一.池化技术之线程池 实现线程池视频讲解,附源码:「链接」 什么是池化技术?简单来说就是优化资源的使用,我准备好了一些资源,有人要用就到我这里拿,用完了就还给我.而一个比较重要的的实现就是线程池.那么 ...

最新文章

  1. 软件测试中7个令人匪夷所思的真理
  2. 大工计算机基础在线作业答案,大工11春《计算机文化基础》在线作业及答案(国外英文资料).doc...
  3. 数据结构--插入排序
  4. 重启计算机设的桌面背景就没了,桌面壁纸无法保存怎么办?Win7系统重启后不保存桌面背景解决方法...
  5. 1687: 数组操作(非常规思维)
  6. 【传智播客】Javaweb程序设计任务教程 黑马程序员 课后答案【合集】
  7. 降低winnt Apache服务的权限,让你的虚拟主机更安全
  8. mysql用binlog恢复数据_利用mysql的binlog恢复数据
  9. Android企业级程序完全退出的解决方案
  10. Java 蓝桥杯 字符串基本用法
  11. 实时时间OBS Studio插件(附下载地址与效果),实时时间插件date-and-time.lua的使用
  12. mysql计算同比和环比的区别_MySQL实践之同比环比
  13. 一对一、一对多、多对多(实操)
  14. tree traversal (树的遍历) - postorder traversal (后序遍历)
  15. springboot At least one base package must be specified的解决方式
  16. 国家开放大学-农村社会学-形考作业3社会问题的调查报告
  17. Ceph对象存储的使用
  18. seamless clone
  19. UESTC 1265
  20. 图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现

热门文章

  1. 全球及中国小型发动机催化剂行业竞争格局及前景趋势预测报告(2022-2027)
  2. pytest学习笔记
  3. MATLAB可视化大学物理学光盘,MATLAB可视化大学物理学
  4. Mac使用U盘只能读取不能写入怎么办?
  5. 【初识太极】CAD用到的各种文件格式,你都知道吗?
  6. 苹果ppt_纯文字的PPT怎么做?太崩溃了,苹果内部PPT给了最完美的答案
  7. python处理扭振信号
  8. 利用会议软件进行高效会议管理的四大优势
  9. php订阅号发送消息,PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息...
  10. 使用jenkins pipeline构建发布流水线