线程状态转换图如下:

1、新建(new):线程对象被创建后就进入了新建状态。如:Thread thread = new Thread();

2、就绪状态(Runnable):也被称为“可执行状态”。线程对象被创建后,其他线程调用了该对象的start()方法,从而启动该线程。如:thread.start(); 处于就绪状态的线程随时可能被CPU调度执行。

3、运行状态(Running):线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权限,暂时停止运行。直到线程进入就绪状态,才有机会进入运行状态。阻塞的三种情况:

1)等待阻塞:通过调用线程的wait()方法,让线程等待某工作的完成。

2)同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程占用),它会进入同步阻塞状态。

3)其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或因异常退出了run()方法,该线程结束生命周期。

这里着重讲一下线程的interrupt

Thread.interrupt()方法: 作用是中断线程。将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为true)。它并不像stop方法那样会中断一个正在运行的线程 

interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程检查到中断标识,就得以退出阻塞的状态。

更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。

使用 interrupt() + InterruptedException来中断线程

  线程处于阻塞状态,如Thread.sleep、wait、IO阻塞等情况时,调用interrupt方法后,sleep等方法将会抛出一个InterruptedException:

public static void main(String[] args) {Thread thread = new Thread() {public void run() {System.out.println("线程启动了");try {Thread.sleep(1000 * 100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程结束了");}};thread.start();try {Thread.sleep(1000 * 5);} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt();//作用是:在线程阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态
}

仅仅退出阻塞状态,线程依旧继续执行。

使用 interrupt() + isInterrupted()来中断线程  

  this.interrupted():测试当前线程是否已经中断(静态方法)。如果连续调用该方法,则第二次调用将返回false。在api文档中说明interrupted()方法具有清除状态的功能。执行后具有将状态标识清除为false的功能。

  this.isInterrupted():测试线程是否已经中断,但是不能清除状态标识。

public static void main(String[] args) {Thread thread = new Thread() {public void run() {System.out.println("线程启动了");while (!isInterrupted()) {System.out.println(isInterrupted());//调用 interrupt 之后为true}System.out.println("线程结束了");}};thread.start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt();System.out.println("线程是否被中断:" + thread.isInterrupted());//true
}

转载:https://www.cnblogs.com/xuzhujack/p/12375765.html

转载:https://www.cnblogs.com/myseries/p/10918819.html

JAVA多线程之状态转换图相关推荐

  1. Java多线程【状态与安全问题】

    Java多线程[状态与安全问题]

  2. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  3. Java多线程 —— 线程状态迁移

    引言 线程状态迁移,又常被称作线程的生命周期,指的是线程从创建到终结需要经历哪些状态,什么情况下会出现哪些状态. 线程的状态直接关系着并发编程的各种问题,本文就线程的状态迁移做一初步探讨,并总结在何种 ...

  4. Java多线程-线程状态

    线程状态 6个状态定义:java.lang.Thread.State New: 尚未启动的线程的线程状态. Runnable: 可运行线程的线程状态,等待CPU调度. Blocked: 线程阻塞等待监 ...

  5. 【Java多线程】Java线程状态及转换方法详解

    文章目录 1. 现代操作系统中的线程状态及转换(5种) 2. Java 线程状态(6种) 2.1 NEW 创建 2.2 RUNNABLE 运行 2.3 BLOCKED 阻塞 2.4 WAITING 等 ...

  6. java多线程之线程创建和状态

    一.概述 1.上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现 这个机制.时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切 换线 ...

  7. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

    在Java面试的时候,经常会问到Java并发编程相关的多线程.线程池.线程锁.线程通信等面试必考点,比如: Java并发编程系列:Java线程池的使用方式,核心运行原理.以及注意事项 Java并发编程 ...

  8. 图解java多线程设计模式 pdf_图解Java设计模式之状态模式

    图解Java设计模式之状态模式 APP抽象活动问题 状态模式基本介绍 状态模式的原理类图 状态模式解决APP抽奖问题 状态模式的注意事项和细节 APP抽象活动问题 请编写程序完成APP抽象活动,具体要 ...

  9. 这是一个不完整的详细Java多线程,但对于初学者足够了,相信我,你会爱上她的

    零基础学习之Java多线程 概述 线程的创建 继承Thread类 创建线程的步骤 线程的使用步骤 代码示例 实现Runnable接口 创建线程的步骤 线程的使用步骤 代码示例 使用匿名内部类创建线程 ...

  10. Java多线程干货系列—(一)Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

最新文章

  1. 论推荐系统与精细化运营
  2. 这是最新的人工发射wifi信号技术吗?
  3. 学计算机怎么收费呢,学计算机怎么收费服务为先_贵阳经济技术学校
  4. ssm整合2 增删改
  5. 计算机之父童年的故事ppt,《“计算机之父”童年的故事》PPT课件2
  6. 记录用户转成超级用户的文件名字_一分钟了解Linux用户
  7. 使用csc手动编译cs文件
  8. (32)FPGA面试技能提升篇(EMMC)
  9. Unity Shader _Time 的单位
  10. .NET Core 2.1 Preview 2带来网络方面的改进
  11. Verilog中的specify block和timing check
  12. SQL语句执行优先级
  13. 毫秒级时间戳php,PHP获取毫秒级时间戳的方法
  14. 电压比较器的介绍和工作原理
  15. LGame-0 3 Android与JavaSE游戏引擎 正式发布,新增SRPG制作模块
  16. 电脑分屏工具 v1.22
  17. 公众平台模板消息所在行业_微信公众号模板消息群发常见问题汇总
  18. [15元]人体行为检测和识别毕业论文讲述
  19. 秃头警告之——使用mondo rescue备份linux系统ISO镜像的踩坑历程
  20. linux运维工程师2017,2017年Linux运维工程师经典面试题汇总

热门文章

  1. 【开源项目分享】使用select、多线程完成的多人联机对战五子棋小游戏(C语言实现)
  2. C++ Eigen库实现矩阵的CholeSky分解
  3. diy个人级超级计算机,八核+七卡!泡泡网DIY个人超级计算机
  4. linux硬盘序列号在哪看,linux下怎样查看硬盘型号和硬盘序列号
  5. 迪普三层核心DPX8000a3实现爱快软路由上网
  6. 公司研制的CPU卡燃气表正式投放北京市场
  7. 土壤类型、土壤质地、土壤养分空间分布
  8. 12个不容错过的Vue UI 组件库
  9. ubuntu系统安装socket服务器,ubuntu 服务器安装socket需要安装啥
  10. 软件测试教务系统测试用例,教务管理系统测试用例.doc