网站首页 > 精选教程 正文
大家好,初来乍到,还希望各路大佬多指点指点!`Java`并发编程线程状态转换,内容通俗易懂,请放心食用。
线程状态
先来个开场四连问
* Java`线程状态有几个?
* Java`线程状态是如何转换?
* Java`线程状态转换什么情况会进入锁的等待队列?
* Java`线程状态转换什么情况会进入锁的同步队列?
一提到`Java`线程状态,不少读者立马想到线程状态转换图,但细想,印象又不深刻,只记得有那么几个状态。
再要你说出`Java`线程状态是如何转换的,脑子里可能就如下图一样,已经是一团浆糊了。
别慌,阿星为了帮读者大大们理清楚上面的问题,会一步一步地把线程状态转换图给画出来,让读者大大们真正的理解Java线程状态转换。
首先线程的状态可以分为`6`态或`7`态,具体状态如下
6台
* `New`:新建状态
* `Runnable`:可运行状态
* `Terminated`:终止状态
* `Waiting`:等待状态
* `TimedWaiting`:超时等待状态
* `Blocked`:阻塞状态
7态
* `New`:新建状态
* `Ready`:就绪状态
* `Running`:运行状态
* `Terminated`:终止状态
* `Waiting`:等待状态
* `TimedWaiting`:超时等待状态
* `Blocked`:阻塞状态
其实6态与7态差别不大,只不过`7`态把`Runnable`可运行状态,拆解成了`Ready`就绪状态与`Running`运行状态。
阿星以`7`态为例,来逐步讲解它们之间是如何转换的。
新建状态(New)
我们可以通过实现`Runnable`接口或继承`Thread`声明一个线程类,`new`一个实例后,线程就进入了新建状态。
> 一个刚诞生的线程,处于新建状态。
就绪状态(Ready)
线程对象创建成功后,调用该线程的`start()`函数,线程进入就绪状态,该状态的线程进入可运行线程池中,等待获取`C P U`的使用权。
> 线程表示,我已经准备好了,此时我是就绪状态,快选我吧~
运行状态(Running)
此时线程调度程序正在从可运行线程池中选择一个线程,该线程进入运行状态。
换句话说,线程获取到了`C P U`时间片。
还没完呢,当线程时间片用完或调用的`yield()`函数,该线程回到就绪状态。
> 作为一名运气好的线程,我进入了运行状态,但是运气用完了,我还得回到就绪状态。
终止状态(Terminated)
线程继续运行,直到执行结束或执行过程中因异常意外终止都会使线程进入终止状态。
线程一旦终止,就不能复生,这是不可逆的过程。
> 线程的人生迎来了终点,可能一帆风顺过完一生,也可能英年早逝令人惋惜。
等待状态(Waiting)
运行状态的线程执行wait()、join()、LockSupport.park()任意函数,该线程进入等待状态。
其中`wait()`与`join()`函数会让J V M把该线程放入锁等待队列。
处于这种状态的线程不会被分配C P U执行时间,它们要等待被主动唤醒,否则会一直处于等待状态。
如果我们要唤醒线程怎么办呢?
执行`LockSupport.unpark(t)`函数唤醒指定线程,该线程回到就绪状态。
而通过`notify()、notifyAll()、join线程执行完毕`方式,会唤醒锁等待队列的线程,出队的线程回到就绪状态。
> 线程的人生迎来了劫难,听信小人之言,跑去菲律宾做打工,结果被黑工厂扣下,只希望警察叔叔能早日解救我出去。
超时等待状态(Timed waiting)
超时等待与等待状态一样,唯一的区别就是多了超时机制,不会一直等待被其他线程主动唤醒,而是到达指定时间后会自动唤醒。
以下函数会触发进入超时等待状态
* wait(long)
* join(long)
* LockSupport.parkNanos(long)
* LockSupport.parkUtil(long)
* sleep(long)
其中`wait(long)、join(long)`函数会让J V M把线程放入锁等待队列。
后面的唤醒剧情就和等待状态如出一辙,就多了超时时间到了,自动唤醒的动作。
> 从菲律宾回国后的线程,也做起了违法的勾当,最终被警察抓捕,好在只判了5年,熬一熬就可以出来了。
阻塞状态(Blocked)
运行状态的线程获取同步锁失败或发出`I/O`请求,该线程进入阻塞状态。
如果是获取同步锁失败`J V M`还会把该线程放入锁的同步队列。
同步锁被释放时,锁的同步队列会出现所有线程,进入就绪状态。
I/O处理完毕时,该线程重新回到就绪状态。
> 出狱后的线程,后面的人生一直都是磕磕碰碰,就没顺利过,大家要引以为戒。
小结
相信大家,已经掌握了线程状态的知识,以后面试官问这类问题,也可以吊打一番,最后放一张简化的线程转换图为本文画上句号。
猜你喜欢
- 2024-11-18 Java面试必考问题:线程的生命周期
- 2024-11-18 Java 19 虚拟线程的状态变化,停驻与锁定
- 2024-11-18 Java线程生命周期详解?
- 2024-11-18 线程从创建最终消亡,要经历的若干状态,你了解其中的多少?
- 2024-11-18 java线程状态之WAITING(等待)
- 2024-11-18 浅谈Java线程:线程基础知识扫盲
- 2024-11-18 Java线程在各个状态下调用start方法会发生什么事情?
- 2024-11-18 为什么Java中线程没有Running状态
- 2024-11-18 阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
- 2024-11-18 可动态调节参数的线程池实现
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)