Java多线程:线程的生命周期 又称 “线程的状态图” 的详细讲解
每博一文案
《杀死一只知更鸟》中有这样一段话:“你永远不可能真正地了解一个人,除非你穿上他的鞋子走来走去,站在他的角度思考问题。可真当你走过他的路时,你连路过都觉得难过。”
世上没有真正的感同身受,也永远不会有一模一样的境遇。很多时候,你以为看到了全貌,但其实只有冰山一角。永远不要凭着一点蛛丝马迹,就随意评判别人的人生。在你看不到的角落里,多的是你不知道的事。不知别人的苦,就别劝人大度;没有经历过他人的难,就不要肆意嘲讽。
【未经他人事,莫论他人非;未经他人苦,莫劝他人善。】
多线程的生命周期过程
多线程是Java中不可避免的一个重要主体。从本章开始,我们将展开对多线程的学习。接下来的内容,是对“JDK中新增JUC包”之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), notify()等接口;Thread类中的接口;synchronized关键字。
注:JUC包是指,Java.util.concurrent包,它是由Java大师Doug Lea完成并在JDK1.5版本添加到Java中的。
如下是简单线程状态图:
线程共包括以下5种状态
- 新建状态(new): 线程对象被创建后,就进入了新建状态,如
Thread thread = new Thread();
这时候的线程还无法获取 cpu时间片(cpu执行权) - 就绪状态(Runnable): 也被称为 ”可执行状态“。线程对象被创建后,其他线程调用了该对象的
start()
方法,从而来启动该线程,进入就绪状 如 :thread.start()
。处于就绪状态的线程,随时可以被CPU调度执行,一旦就绪状态的线程获取到 cpu时间片(cpu执行权) 就进入了 运行状态 。 - 运行状态(Running): 就绪状态的线程获取到了 CPU时间片(cpu执行权) 就可以执行了,需要注意的是:线程只能从就绪状态进入到运行状态。
- 阻塞状态(Blocked): 阻塞状态时线程,因为某种原因放弃了 CPU的使用权,暂时停止了运行。当阻塞状态结束了,就会进入到就绪状态(重新获取cpu时间片(cpu执行权)) ,才有机会转到运行状态,完成因阻塞时中断的程序的位置继续执行。阻塞的情况分为三种:
- 等待阻塞 :通过调用线程的
wait()
方法,让线程等待某工作的完成。等待被notify(),notifyAll()
方法唤醒,结束等待阻塞。 - 同步阻塞: 线程在获取
synchronized
同步锁失败(因为锁被其它线程所占用了),它会进入同步阻塞状态,等待对方的锁的释放,获取到同步锁,结束同步阻塞。 - 其他阻塞: 通过调用线程的
sleep()
或join()
或发出了的I/O
请求时,线程会进入到阻塞状态。当sleep()
状态结束/超时,join()
等待线程终止或超时,结束,或者I/O
处理完毕时,线程重新转入就绪状态。
- 等待阻塞 :通过调用线程的
- 死亡状态(Dead): 线程执行完了,或者因异常退出了,或者Error 错误终止了,或 run()方法结束了,该线程结束生命周期,所有的线程的最后都是 死亡状态,不是一个线程一直执行下去的 。
这5种状态涉及到的内容包括Object类, Thread和synchronized关键字。
Object类:定义了wait(), notify(), notifyAll()
等休眠/唤醒函数。
Thread类:定义了一些列的线程操作函数。例如:sleep()
休眠函数, interrupt()
中断函数, getName()
获取线程名称等。
synchronized:是关键字;它区分为synchronized
代码块和synchronized
方法。synchronized
的作用是让线程获取对象的同步锁。
关于其中状态转换方法的使用,大家可以移步至
- Java多线程:创建多线程的“四种“ 方式_ChinaRainbowSea的博客-CSDN博客
- Java多线程:多线程 Thread 类 中常用的方法的使用_ChinaRainbowSea的博客-CSDN博客
- Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题_ChinaRainbowSea的博客-CSDN博客
- Java多线程:线程的优先级 || 线程的中断 || 线程的分类 || 线程的定时器_ChinaRainbowSea的博客-CSDN博客
- Java多线程:线程通信:生产者 和 消费者 || 顺序打印_ChinaRainbowSea的博客-CSDN博客
最后:
限于自身水平,其中存在的错误,希望大家,给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!