JAVA线程状态的10种转换
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种转换相关推荐
- 理解Java线程状态(6种,6种,6种)
什么是线程 线程具有许多传统进程所具有的特征,故又称为轻型进程(Light-Weight Process)或进程元:而把传统的进程称为重型进程(Heavy-Weight Process),它相当于只有 ...
- 【Java多线程】Java线程状态及转换方法详解
文章目录 1. 现代操作系统中的线程状态及转换(5种) 2. Java 线程状态(6种) 2.1 NEW 创建 2.2 RUNNABLE 运行 2.3 BLOCKED 阻塞 2.4 WAITING 等 ...
- java线程切换 notify_浅谈 Java线程状态转换及控制
作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...
- Java线程状态及转换
推荐:Java并发编程汇总 Java线程状态及转换 原文地址 Java线程状态和关闭线程的正确姿势 正文 Java中的线程有六种状态,使用Thread类中的枚举类来实现,如下,我对每个状态都进行了一定 ...
- Java线程到底有几种状态
前言 很多文章说Java线程有五种状态:NEW(新建).RUNNABLE(就绪).RUNNING(运行).BLOCKED(阻塞).DEAD(死亡),而阻塞又分为等待阻塞.同步阻塞.其它阻塞. 很遗憾这 ...
- 【图解】透彻Java线程状态转换
大家好,我是阿星,好久不见,欢迎来到Java并发编程系列番外篇线程状态转换,内容通俗易懂,请放心食用. 线程状态 先来个开场四连问 Java线程状态有几个? Java线程状态是如何转换? Java线程 ...
- 面试必备,Java线程状态之细节回顾
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/vYqjShos Java线程有6种状态 在某个给定时间点 ...
- Java线程状态及 wait、sleep、join、interrupt、yield等的区别
Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到 被中断.被拥有该对象锁的线程唤醒(notify或not ...
- Java 线程状态之 TIMED_WAITING
定义 一个正在限时等待另一个线程执行一个动作的线程处于这一状态. A thread that is waiting for another thread to perform an action fo ...
最新文章
- 世界顶级赛事百万座位如何做到票务限时匹配?
- abb变频器acs800功率_ABB变频器如何选型(1)
- css样式之background详解(格子效果)
- efi分区咋移动到c盘里_怎么手动安装CLOVER到U盘EFI分区
- 计算机网络重要机制(一)可靠数据传输
- 6-3cifar10数据集介绍-读取-处理
- asp.net 页面右下角弹出类似QQ或MSN的消息提示
- c# 程序员学习android(2)登陆界面
- 工作总结-虚拟机参数
- vue 项目路由配置
- WBE前端笔记3:JavaScript练习--基础语法
- msdia80.dll文件出现在磁盘根目录下的解决方案
- python触发点击事件,如何在python中模拟onclick事件?
- 大数据开发面试准备——计算机网络
- 计算机图形学 | 实验四:绘制一个球体
- Argo-DCS数据传输笔记
- SPSS Modeler 多元线性回归分析(指南 第九章)
- 解决office因存在32位,无法安装64位的问题
- IBM X60驱动程序的安装
- ZMQ 第四章 可靠的请求-应答模式