core java 14.3

14.3  线程状态

线程会是以下六种状态之一:

new

Runnable

Blocked(堵塞)

Waiting

Timed Waiting

Terminated

上述的每一种状态都会在接下来的部分中提及。

要知道当前线程的状态,可以调用getState方法

14.3.1 New Threads

当你创建一个线程伴随着new指针的时候,例如:new Thread(r)线程还没有运行。这就意味着它是在new的状态。

当一个线程在new的状态是,程序还没开始运行它内部的代码。确定数目的记录需要被完成在这个线程可以运行之前(原话是: A certain amout of bookkeeping needs to be done before a  thread can run, 这里笔者不知道如何翻译)。

14.3.2  Runnable Threads

一旦你调用了start方法,线程会进入runnable状态。一个在runnable状态的线程实际上也许不会运行。这取决于操作系统是否给予这个线程运行。(虽然java规格说明书里面没有区分这些不同的状态。一个运行中的线程仍然是在runnable状态。)

一旦线程已经运行,它实际上不需要保持持续运行。事实上,一个运行中的线程偶然中止让其他的线程有机会去运行,这样的情况甚至是被期待的。线程运行时间表的细节取决于设备上的操作系统所提供方案。抢占式系统给每个runnable状态的线程一段执行它的任务的时间,当时间完毕以后,操作系统会抢占线程资源并给予其他线程运行的机会。当选择一个下一个线程时,操作系统会考虑线程的优先权。

所有的现代台式机和服务器操作系统都使用抢占式调度,但是,小型的设备例如电话可能还是使用协同式调度。在这样的设备中,一个线程只会在它调用yield方法,或者处于堵塞和等待状态下失去对资源的控制权。

在一个有多处理器的机器上,每一个处理器都可以运行一个线程,因此我们可以并行运行多个线程,但是如果线程数目比处理器多,调度机还是会进行时间分片。

永远记住,一个在runnable状态的线程在任何时刻都不一定正在运行(这也是这个状态叫runnable而不是running的原因)

14.3.3 Blocked and Waiting Threads

当一个线程是堵塞或者等待状态是,它暂时你、不活跃。它不运行任何代码,不消耗任何资源。它等待调度机去唤醒。具体细节决定于不活跃状态是怎么达到的。

当线程尝试去获取加了对象锁的目前被其他线程使用着的资源时就会进入堵塞状态。该线程在其他所有线程都解开该锁并且调度机允许该线程去使用资源的时候,就会脱离堵塞状态。

当线程等待另一个线程去通知调度器一个条件,它就进入了waiting状态。这种情况可能发生在调用 Object.wait 或者 Thread.join 方法中,等待锁的情况下。实际上,bocked和waiting状态的差别并不重要。

少数的方法具有timeout参数。调动他们会导致线程进入timed waiting状态。这个状态直到时间终止或者适合的统治到达才结束。包括方法:Thread.sleep, object.wait, Thread.join, Lock.tryLock, Condition.await .









Figure , 14.3


14.3.4 终结状态

线程被总结有以下两个原因:

1. run方法退出,自然死亡

2. 一个没有被捕获的错误突然杀死run方法。

特别地,你可以杀死一个线程通过调用stop方法。该方法抛出ThreadDeath错误对象可以杀死线程。但是,反对使用该方法,你不应该在自己的代码中使用该方法(难道应该在别人的代码中使用???)


void join()

等待特别的线程终止

void join(long millis)

等待特定的线程死亡或者特定毫秒过去。

Thread.State getState()

得到此线程状态,NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING, or TERMINATED之一

void stop()

停止线程,反对使用此方法

void suspend()

暂停线程的运行,反对使用此方法。

void resume()

从新获取此线程,此方法只能在suspend方法使用后使用,反对使用此方法。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章