11.4.3 改变线程状态

11.4.3 改变线程状态

Thread类中定义了sleep(),yield(),join(),interrupt()等多个方法用于改变线程的状态。

1.线程睡眠sleep()

public static void sleep(long mills)throws interruptedException

当前线程休眠(停止运行)若干毫秒,线程由运行中状态进入不可运行状态,睡眠时间过后线程再进入可运行状态。

2.暂停线程yield()

public static void yield()

暂停当前线程执行,允许其他线程执行。该线程仍处于可运行状态,不转为阻塞状态。此时,系统选择其他同优先级线程执行,若无其他同优先级线程,则选中该线程继续执行。

yield()方法的优点是:保证有工作时不会让CPU闲置。主要用于编写多个合作线程,也适用于强制线程间的合作。

3.连接线程join()

join()方法使当前线程暂停执行,等待调用该方法的线程结束后再继续执行本线程。它有三种调用格式:

img466

等待调用该方法的线程结束,或者最多等待mills毫秒+ nanos纳秒后,再继续执行本线程。

如果需要在一个线程中等待,直到另一个线程消失,可以调用join()方法。如果当前线程被另一线程中断,join()方法会抛出InterruptedException异常。

4.中断线程interrupt()

img467

说明:interrupt()方法为线程设置一个中断标记,以便于run()方法运行时使用isInterrupted()方法能够检测到,此时,线程在sleep()之类的方法中被阻塞时,由sleep()方法抛出一个InterruptedException异常,然后捕获这个异常以处理超时。

注意:interrupted()方法只是为线程设置了一个中断标记,并没有中断线程运行。一个线程在被设置了中断标记之后仍可运行,isAlive()返回true。实例方法isInterrupted()测试线程的中断标记,并不清楚中断标记。而静态的interrupted()方法则不同,它会测试当前测试执行的线程是否被中断,并且在肯定的情况下,清除当前线程对象的中断标记并返回true。

当抛出一个InterruptedException异常时,记录该线程中断情况的标记将会被清除,这样后面对isInterrupted()或interrupted()的调用将返回false。