多线程3——中断线程
时间:2010-09-06 来源:朱宇华
当在提交一个线程的中断请求命令前,往往需要先检查一下该线程是否处于非中断状态。如果该进程被阻塞,则该线程无法检查自身是否处于中断状态,并抛出InterruptedExeption异常(即由isInterrupted方法抛出该异常)。
try
{
while (!Thread.currentThread().isInterrupted()) //检查当前进程是否处于非中断状态
{
//do some work
}
}
catch (InterruptedException e)
{
}
中断一个线程并非是中止该线程(当然,大多数情况下,中断一个线程就是想中止它),中断线程的目的有的时候是让该线程进行计算或者分析,当线程恢复后该执行哪些命令。
有些重要的线程,在被中断时即使抛出了InterruptedExeption异常,也还需要进行一些命令步骤,这些命令被卸载final{...}里面。
public void run()
{
try
{
while (!Thread.currentThread().isInterrupted())
{
//do some work
}
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
final
{
//do some extra work
}
}
如果每次执行完任意一个线程的命令后,都把该线程sleep了,则不需要用isInterrupted方法检查该线程是否处于中断状态。因为当一个线程处在sleep状态时,对该线程请求中断会自动抛出InterruptedException异常,所以就有:
public void run()
{
try
{
while (some condition)
{
//do some work
Thread.sleep(DELAYS);
}
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
final
{
//do some extra work
}
}
除了上面的isInterrupted方法可以检查线程是否处于中断状态以外,还有interrupted方法也有类似的效果。它们之间的区别是:interrupted方法是一个静态方法,这样它只能检查当前线程是否处于中断状态;而isInterrupted方法是一个instance method,所以它用来检查任意一个线程是否处于中断状态。
注意:catch (InterruptedException e){...} 的时候,尽量不要把大括弧里的内容不写。即使你想不出来抓到异常后该做什么,也可以直接在大括号内写上:
catch (InterruptedException e)
{
Thread.currentThread().interrupt(); //对当前线程直接抛出异常
}
或者干脆把异常throw掉,让使用它的程序来接受异常。总之不要把异常屏蔽掉。
public void myTask() throw interruptedException
{
while (!Thread.currentThread().isInterrupted())
{
//do some work
}
}