哥们,看了你的问题
线程的状态四种:
1.新建 new,线程被创建时,会短暂的处于这种状态,他已经分配了必需的资源,并执行了初始化,
2.就绪Runnable,这种状态下,只要调度器把时间片分配给线程,线程就可以运行。
3.阻塞Blocked,线程能够运行,但是某个条件阻塞了,调度器将忽略线程,不会分配线程任何CPU时间,直到线程重新进入就绪状态
4.死亡Dead,处于死亡或终止状态的线程将不再是可调度的,并且再也不会得到CPU时间
哪些阻塞状态下不可以中断?是我的理解有问题?
至于线程在哪些状态下可以中断?这个在:1. 新建 new 2.就绪Runnable 阻塞比较难预测,因为他们取决于外部事件。
.简单的中断处理方式
正在处理的任务,让他停止,最简单的方式就是自己维持一个cancel的标志,类似这样:1.private volatile boolean cancelled;
public void run(){
while(!cancelled){
//do sth
}
}
sleep、wait、BlockingQueue.put等等是会相应中断的,即可中断的,Thread类包含interrupt方法,可以终止被阻塞的任务,这个方法设置线程的中断状态;如果这个线程已经阻塞,或者将执行一个阻塞操作,那么将抛出InterruptedException异常;基本上,针对异常,最好做一些和业务相关的处理,最好不要直接抛出,也不要直接吃掉异常。 |