(三) 线程状态
1.新生线程
当new一个线程时,如new Thread(r),该线程的状态是new。当一个线程处于新生状态时,程序还有没有开始运行线程中的代码。在线程运行之前还有一些簿记工作要做。
2.可运行线程
调用start()方法,线程处于runnable状态。可能运行也可能没有运行,取决于系统(线程的优先级和时间片机制)。在具有多个处理器的机器上,每个处理器,运行一个线程,可以有多个线程并行运行(如果线程多出处理器的数目,调度器依然采用时间片机制)。
3.被阻塞线程和等待线程
当线程处于被阻塞或等待状态时,它暂时不活动,不运行任何代码且消耗最少的资源。直到线程调度器重新激活它。
(1) 阻塞状态 : 当一个线程试图获取一个内部的对象锁(不是java.util.concurrent库中得锁),而该锁被其他线程持有,则该线程进入阻塞状态。当所有其他线程释放该锁,并且线程调度器允许本线程持有它的时候,该线程将变成非阻塞状态。
(2) 等待状态 : 当一个线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。 比如:调用Object.wait或Thread.join方法,或者是等待java.util.concurrent库中的lock或Condition时,就会出现这种状态。被阻塞和和等待状态有很大的不同。
(3) 计时等待状态 : 有几个方法有一个超时参数。调用它们导致线程进入计时等待(timed waiting)状态。这一状态将一直保持到朝时期满或者接收到适当的通知。带有超时参数的方法有Thread.sleep和Object.wait、Thread.join、Lock.tryLock以及Condition.await的计时版。
4.Terminated(被终止)
线程因如下两个原因之一而被终止:
(1) 因为run()方法的正常退出而自然死亡。
(2) 因为一个没有捕获的异常终止了run()方法而意外死亡。
注意: 可以调用线程的stop()【已过时】方法杀死一个线程,该方法抛出ThreadDeath错误对象,由此杀死线程。