11.3 使用Thread类
作为线程的跨平台抽象,Thread类中提供的方法并不多。这主要是因为不同平台上的线程实现差别很大,很难提供一个完整的抽象。在JDK最早的版本中,Thread类提供了对线程进行控制的一些方法,包括stop、suspend、resume和destroy等,分别用来停止、暂停和继续线程的执行及销毁一个线程。这些方法在随后的版本中被声明为废弃的,因为这些方法在实现上是不安全的,使用时可能会造成对象损坏和出现线程死锁的问题。这也从一个侧面说明了跨平台线程实现的复杂性。通过start方法启动一个线程的运行之后,应该让线程运行完其所包含的全部代码之后自动结束,而不需要通过stop方法强制终止一个线程。要暂停或继续一个线程的执行,可以使用Object类的wait和notify方法提供的线程等待和唤醒机制。
11.3.1 线程状态
在一个Thread类的对象被创建出来之后,它可能处于不同的状态中。进行与线程相关的不同操作可能导致该Thread类的对象所处的状态发生变化。不同的线程状态由枚举类型Thread.State来表示,可以通过Thread类的getState方法来得到。Thread.State只表示虚拟机中线程的状态,并不表示对应的操作系统上的线程的状态。Thread.State中包含的线程状态有以下几种。
1)NEW:线程刚被创建出来。一个新创建的Thread类的对象处于此状态中。
2)RUNNABLE:线程处于可运行的状态。该线程有可能正在运行,也有可能在等待其他操作系统中的资源。
3)BLOCKED:线程在等待一个监视器对象上的锁时,处于此状态。当一个线程尝试执行声明为synchronized的方法或代码块,又无法获取对应的锁时,处于BLOCKED状态。
4)WAITING:调用某些方法会使当前线程进入等待状态。这个等待没有超时时间。处于这个状态的线程等待其他线程执行特定的操作来使当前线程退出等待状态。
5)TIMED_WAITING:该状态类似于WAITING,但是增加了指定的超时时间。当超时时间过去,如果线程等待的条件仍然没有发生,那么线程也会退出等待状态。
6)TERMINATED:线程的运行已经终止。
线程在同一时刻只能处于上述六种状态中的一种。了解线程的状态可以为调试提供帮助。