每个线程都是和生命周期相联系的,一个生命周期含有多个状态,这些状态间可以互相转化。Java语言中线程的生命周期可以分为以下6种状态:
•创建状态。
•可运行状态。
•阻塞状态。
•等待状态。
•计时等待状态。
•终止状态。
一个线程创建之后,总是处于其生命周期6个状态中的一个,线程的状态表明此线程当前正在进行的活动,而线程的状态是可以通过程序来进行控制的,也就是说,可以对线程进行操作来改变状态。通过各种操作,线程的6个状态之间的转换关系如图9.7所示。
图9.7 线程状态转换图
1.创建状态
如果创建了一个线程而没有启动它,那么此线程就处于创建状态。刚创建的线程不能执行,必须向系统进行注册、分配必要的资源后才能进入可运行状态,这个步骤是由start()方法完成的,而处于可运行状态的线程也未必一定正在运行中,它有可能由于外部的I/O请求而处于阻塞状态。进入终止状态后,此线程就不再存在了。
2.可运行状态(www.daowen.com)
如果对于一个处于创建状态的线程调用start()方法,则此线程便进入可运行状态。使线程进入可运行状态的实质是调用了线程体的run()方法,此方法是由JVM执行start()分配完必要的资源之后自动调用的。所以,一般情况下,我们不要在用户程序中显式调用run()方法。
线程处于可运行状态只说明它具备了运行条件,但可运行状态并不一定是正在运行的状态,因为在单处理器系统中运行多线程程序,实际上在一个时间点只有一个线程在运行,而系统中往往有多个线程同时处于可运行状态。系统通过快速切换和调度使所有可运行线程共享处理器,造成宏观上的多线程并发运行。由此可见,一个线程是否处于运行状态,除了必须处于可运行状态外,还取决于系统的调度。
现在的桌面和服务器操作系统都使用抢占式调度。抢占式调度系统给每一个可运行的线程一个时间片来执行任务。当时间片用完,操作系统剥夺该线程的运行权,调试另一个线程获得CPU并运行。处于在可运行状态可以进行多种操作,从而使线程的状态发生变化,例如,调用sleep方法会使线程进入阻塞状态,调用wait方法会使线程进入等待状态。
3.阻塞和等待状态
阻塞和等待状态是由可运行状态转变来的。当线程处于阻塞或等待状态时,它就会暂时放弃获得处理机的权利,直到线程调试器重新激活它。处于阻塞和等待状态有以下多种原因:
(1)当一个线程视图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态。当其他线程释放该锁,并且线程调度器允许本线程持有它时,该线程将变为可运行状态。
(2)当线程调用wait()方法来等待另一个线程的通知,或者调用join()方法等待另一个线程执行结束的时候,线程就会进入等待状态。
(3)如果线程调用sleep()、wait()、join()等方法,传递一个超时参数,这些方法执行的时候就会使线程进入计时等待状态。
4.终止状态
一个线程可以由任何一个状态通过终止(stop)操作而进入终止状态。线程一旦进入终止状态,它将不再存在,所以也不可能再转到其他状态。
通常,在一个应用程序运行时,如果通过其他外部命令终止当前应用程序,那么就会调用stop方法终止进程。但是,最正常、最常见的途径是由于线程在可运行状态正常完成自身的任务而“寿终正寝”,从而进入终止状态,这个完成任务的动作是由run方法实现的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。