EchoDemo's Blogs

Java中线程的生命周期

与人的生老病死一样,线程也同样要经历新建、就绪、运行、阻塞和死亡五种不同的状态。这五种状态都可以通过Thread类中的方法进行控制。

(1)新建状态(New Thread):在Java语言中使用new操作符创建一个线程后,该线程仅仅是一个空对象,它具备类线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态。线程处于创建状态时,可通过Thread类的方法来设置线程各种属性,如线程的优先级(setPriority)、线程名(setName)和线程的类型(setDaemon)等。

(2)就绪状态(Runnable):使用start()方法启动一个线程后,系统为该线程分配除CPU外的所需资源,使该线程处于就绪状态。此外,如果某个线程执行了yield()方法,那么该线程会被暂时剥夺CPU资源,重新进入就绪状态。

(3)运行状态(Running):Java运行系统通过调度选中一个处于就绪状态的线程,使其占用CPU并转为运行状态。此时,系统真正执行线程的run()方法。可以通过Thread类的isAlive()方法来判断线程是否处于就绪状态:当线程处于就绪/运行状态时,isAlive()方法返回true;否则的话,线程可能处于阻塞状态也可能是处于停止状态。

(4)阻塞状态(Blocked):一个正在运行的线程因某些原因不能继续运行时,就进入阻塞状态。包括以下原因:

a、当执行了某个线程对象的sleep()等阻塞类型的方法时,该线程对象会被置入一个阻塞集(Blocked Pool)内,等待超时而自动苏醒。

b、当多个线程试图进入某个同步区域(synchronized)时,没能进入该同步区域的线程会被置入锁定集(Lock Pool),直到获得该同步区域的锁,进入就绪状态。

c、当线程执行了某个对象的wait()方法时,线程会被置入该对象的等待集(Wait Pool)中,直到执行了该对象的notify()方法,wait()/notify()方法的执行要求线程首先获取到该对象的锁。

(5)死亡状态(Dead):线程在run()方法执行结束后进入死亡状态。此外,如果线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态。

(6)终止线程的三种方法

a、使用退出标志,使线程正常退出,也就是run()方法完成后线程终止,推荐使用。

b、使用stop()方法强行终止线程(这个方法不推荐使用,因为stop()和suspend()、resume()一样,也可能发生不可预料的后果)。

c、使用interrupt()方法中断线程。
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------