java中多线程的生命周期是怎样的?详细解析

BSO 2020-11-17 16:36:32 java常见问答 4333

上次已经为大家介绍过java多线程有哪些优缺点的主要内容了。大家也都知道,关于多线程的内容是非常多的,涉及的范围也是很广阔的。今天就来一起了解一下有关多线程生命周期的有关内容吧。

多线程的生命周期,具体介绍如下:

1.线程状态:

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

2.创建并运行线程:

⑴新建状态(New Thread):在Java语言中使用new操作符创建一个线程后,该线程仅仅是一个空对象,它具备类线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态。

线程处于创建状态时,可通过Thread类的方法来设置各种属性,如线程的优先级(setPriority)、线程名(setName)和线程的类型(setDaemon)等。

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

⑶运行状态(Running):Java运行系统通过调度选中一个处于就绪状态的线程,使其占有CPU并转为运行状态。此时,系统真正执行线程的run()方法。

当然也可以通过Thread类的isAlive方法来判断线程是否处于就绪/运行状态:当线程处于就绪/运行状态时,isAlive返回true,当isAlive返回false时,可能线程处于阻塞状态,也可能处于停止状态。

⑷阻塞和唤醒线程

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

主要有以下这些情况:

①等待阻塞:当线程执行了某个对象的wait()方法时,线程会被置入该对象的等待集中,直到执行了该对象的notify()方法wait()/notify()方法的执行要求线程首先获得该对象的锁。

②同步阻塞:当多个线程试图进入某个同步区域(同步锁)时,没能进入该同步区域(同步锁)的线程会被置入锁定集(锁池)中,直到获得该同步区域的锁,进入就绪状态。

③其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

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

java中多线程的生命周期还是比较复杂的,包含了很多种情况,要结合具体的情况进行分析。如果你对java知识感兴趣,想要了解更多java基础知识,敬请关注奇Q工具网。

推荐阅读:

java多线程同步与异步的关键字,详细解析

java线程池如何实现方法?和线程区别在哪?

java多线程的同步与异步,详细解析