JAVA线程状态转换

参考视频:https://www.bilibili.com/video/BV16J411h7Rd
后续将继续补充,同时完善。

情况1NEW–>RUNNABLE

​ 当调用t.start()方法的时候,由NEW–>Runnable

情况2RUNNABLE<–>WATTING

​ t线程用synchronize(obj)获得对象锁后:

  • ​ 调用obj.wait()方法时,t线程从RUNNABLE–>WAITING
  • ​ 调用obj.notify(),obj.notifyAll,t.interrupt时:

​ 竞争锁成功,t线程WAITING–>RUNNABLE

​ 竞争锁失败,t线程从WAITING–>BLOCKED

@Slf4j(topic = "c.TestWaitNotify")
public class TestWaitNotify {final static Object obj = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (obj) {log.debug("执行....");try {obj.wait(); // 让线程在obj上一直等待下去} catch (InterruptedException e) {e.printStackTrace();}log.debug("其它代码....");}},"t1").start();new Thread(() -> {synchronized (obj) {log.debug("执行....");try {obj.wait(); // 让线程在obj上一直等待下去} catch (InterruptedException e) {e.printStackTrace();}log.debug("其它代码....");}},"t2").start();// 主线程两秒后执行sleep(0.5);log.debug("唤醒 obj 上其它线程");synchronized (obj) {//            obj.notify(); // 唤醒obj上一个线程obj.notifyAll(); // 唤醒obj上所有等待线程}}
}

情况3 RUNNABLE<–>WATTING

  • 当前线程调用t.join()方法时,当前线程从RUNNABLE --> WAITING

    • 注意是从当前线程在t线程对象的监视器上等待
  • t线程运行结束,活调用了当前线程的interrupt()时,当前线程从WAITING–> RUNNNABLE

情况4 RUNNABLE<–>WATTING

  • 当前线程调用LockSupport.park()方法会让当前线程从RUNNABLE --> WAITING

  • 调用LockSupport.unpark(目标线程)或调用了线程的interrupt(),会让目标线程从WAITING -->RUNNABLE

情况5RUNNABLE<–>TIMED_WATTING

t线程用synchronize(obj)获取了对象锁后

  • 调用obj.wait(long n)方法时,t线程从RUNABLE -->TIMED_WAITING

  • t线程等待时间超过了n毫秒,或调用obj.notify(),obj.notifyAll(),t.interrupt时

    • 竞争锁成功,t线程从TIMED_WAITING -->RUNNABLE

    • 竞争锁失败,t线程从TIMED_WAITING --> BLOCKED

情况6 RUNNABLE<–>TIMED_WATTING

  • 当前线程调用t.join(long n) 方法是,当前线程从RUNNABLE --> TIMED_WAITING

    • 注意是当前线程t线程****对象的监视器上等待
  • 当前线程等待时间超过了n毫秒,或t线程运行结束,调用了当前线程的interrupt()时,当前线程从TIMED_WAITING --> RUNNABLE

情况7 RUNNABLE<–>TIMED_WATTING

  • 当前线程调用Thread.Sleep(long n) ,当前线程从RUNNABLE -->TIMED_WAITING

  • 当前线程等待时间超过了n毫秒,当前线程从TIMED_WAITING -->RUNNABLE

情况8 RUNNABLE<–>TIMED_WATTING

  • 当前线程调用LockSupport.parkNanos(long nanos) 或LockSupport.parkUntil(long millis)时,当前线程从RUNNABLE -->TIMED_WATTING

  • 调用LockSupport.unpark(目标线程)或调用了线程的interrupt(),或是等待超时,会让目标线程从TIMED_WATTING–> RUNNABLE

情况9 RUNNABLE<–>BOLCKED

  • t线程用synchronized(obj)获取了对象锁时如果竞争失败,从RUNNABLE -->BLOCKED

  • 持obj锁线程的同步代码块执行完毕,会唤醒该帝乡上所有的BLOCKED的线程重新竞争,如果其中t线程竞争成功,从BLOCKED -->RUNNABLE,其他失败的线程任然BLOCKED

情况10 RUNNABLE<–>TERMINATED

当前线程所有代码运行完成,进入TERMINATED

–>RUNNABLE,其他失败的线程任然BLOCKED

情况10 RUNNABLE<–>TERMINATED

当前线程所有代码运行完成,进入TERMINATED

情况8

JAVA线程状态的10种转换相关推荐

  1. 理解Java线程状态(6种,6种,6种)

    什么是线程 线程具有许多传统进程所具有的特征,故又称为轻型进程(Light-Weight Process)或进程元:而把传统的进程称为重型进程(Heavy-Weight Process),它相当于只有 ...

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

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

  3. java线程切换 notify_浅谈 Java线程状态转换及控制

    作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...

  4. Java线程状态及转换

    推荐:Java并发编程汇总 Java线程状态及转换 原文地址 Java线程状态和关闭线程的正确姿势 正文 Java中的线程有六种状态,使用Thread类中的枚举类来实现,如下,我对每个状态都进行了一定 ...

  5. Java线程到底有几种状态

    前言 很多文章说Java线程有五种状态:NEW(新建).RUNNABLE(就绪).RUNNING(运行).BLOCKED(阻塞).DEAD(死亡),而阻塞又分为等待阻塞.同步阻塞.其它阻塞. 很遗憾这 ...

  6. 【图解】透彻Java线程状态转换

    大家好,我是阿星,好久不见,欢迎来到Java并发编程系列番外篇线程状态转换,内容通俗易懂,请放心食用. 线程状态 先来个开场四连问 Java线程状态有几个? Java线程状态是如何转换? Java线程 ...

  7. 面试必备,Java线程状态之细节回顾

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/vYqjShos Java线程有6种状态 在某个给定时间点 ...

  8. Java线程状态及 wait、sleep、join、interrupt、yield等的区别

    Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到  被中断.被拥有该对象锁的线程唤醒(notify或not ...

  9. Java 线程状态之 TIMED_WAITING

    定义 一个正在限时等待另一个线程执行一个动作的线程处于这一状态. A thread that is waiting for another thread to perform an action fo ...

最新文章

  1. 世界顶级赛事百万座位如何做到票务限时匹配?
  2. abb变频器acs800功率_ABB变频器如何选型(1)
  3. css样式之background详解(格子效果)
  4. efi分区咋移动到c盘里_怎么手动安装CLOVER到U盘EFI分区
  5. 计算机网络重要机制(一)可靠数据传输
  6. 6-3cifar10数据集介绍-读取-处理
  7. asp.net 页面右下角弹出类似QQ或MSN的消息提示
  8. c# 程序员学习android(2)登陆界面
  9. 工作总结-虚拟机参数
  10. vue 项目路由配置
  11. WBE前端笔记3:JavaScript练习--基础语法
  12. msdia80.dll文件出现在磁盘根目录下的解决方案
  13. python触发点击事件,如何在python中模拟onclick事件?
  14. 大数据开发面试准备——计算机网络
  15. 计算机图形学 | 实验四:绘制一个球体
  16. Argo-DCS数据传输笔记
  17. SPSS Modeler 多元线性回归分析(指南 第九章)
  18. 解决office因存在32位,无法安装64位的问题
  19. IBM X60驱动程序的安装
  20. ZMQ 第四章 可靠的请求-应答模式

热门文章

  1. Matlab 中 rank() 函数的用法—求矩阵的秩
  2. 动态规划问题解决方法及示例
  3. 详解动态规划01背包问题--JavaScript实现
  4. python数据挖掘(1.亲和性分析)
  5. JQuery动态生成Table表格
  6. 1.DLL注入相关概念
  7. Node.js 中 __dirname 和 ./ 的区别
  8. 三种方式修改 MySQL 数据库名
  9. AI人工智能毕业设计课题:人脸识别,人脸识别系统,人脸识别考勤系统
  10. CameraCaptureSession