在某些情况下,线程必须被突然终止,比如线程阻塞等情况。
线程分为4个状态:
(1)新建,就相当于一辆刚刚被制造出来的汽车,此时它已经被分配了必要的系统资源,并执行了初始化,此时的汽车已经有资格上路,而线程呢也有资格获取CPU的时间,之后就等待调度器将线程变为运行或阻塞状态。
(2)就绪:此时汽车已经加好油,准备就绪,只等待驾驶员来开车,而线程在这种状态下呢,只要调度器将CPU时间片分配给线程,线程就能运行。线程可以随时运行或者不运行。
(3)阻塞:汽车被堵在了路上,不能继续前行,但是执行路面通畅就能继续前行。当线程处于阻塞状态时,调度器将忽略线程,不会给其分配CPU时间,等待线程重新进入就绪状态,才有可能执行操作
(4)死亡:汽车已经报废,不再能够上路行驶,处于这种状态下线程不再是可调度的,也不会再获得CPU时间。任务死亡的方式通常是从run()方法返回。
进入阻塞状态:(1)sleep() (2)wait() (3)等待某个输入或者输出的完成 (4)线程试图调用某个对象的同步控制方法,但是对象锁不可用,已经被另外一个对象获取(被锁住的代码块,就像一个单人厕所,人多的时候后面的得排队等前面的使用完)。
中断:在Runnable.run()方法的中间打断它,当你打断被阻塞的任务时吗,可能需要清理资源,因为这点,在任务的run方法中打断,更像是抛出异常。为了调用interrupt()必须要持有Thread对象在新的concurrent类库中似乎在尽量避免直接操作Thread对象(埃克尔),转而使用Executor来执行所有操作。
阶段总结:想退出阻塞任务可以用到中断结束任务,但是I/O阻塞和synchronized块导致的阻塞式不可中断的。任务以不可中断的方式阻塞,有潜在锁住程序的可能性。在Java SE5中加入了ReentrantLock上阻塞的任务可以被中断。 检查中断:如果编写了可能产生阻塞的代码,而在run()循环恰巧没产生阻塞调用的情况下,需要用检查中断来退出。
