1. interrupt()说明
在介绍终止线程的方式之前,有必要先对interrupt()进行了解。
关于interrupt(),java的djk文档描述如下:
http://docs.oracle.com/javase/7/docs/api/
Interrupts this thread.
Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is invoked, which may cause a SecurityException to be thrown.
If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.
If this thread is blocked in a Selector then the thread's interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector's wakeup method were invoked.
If none of the previous conditions hold then this thread's interrupt status will be set.
Interrupting a thread that is not alive need not have any effect.
大致意思是:
interrupt()的作用是中断本线程。
本线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查 权限。这有可能抛出SecurityException异常。
如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻 塞)状态,或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也 会让它进入阻塞状态。若线程在阻塞状态时,调用了它的interrupt()方法,那么它的“中断状态 ”会被清除并且会收到一个InterruptedException异常。例如,线程通过wait()进入阻塞状态,此 时通过interrupt()中断该线程;调用interrupt()会立即将线程的中断标记设为“true”,但 是由于线程处于阻塞状态,所以该“中断标记”会立即被清除为“false”,同时 ,会产生一个InterruptedException的异常。
如果线程被阻塞在一个Selector选择器中,那么通过interrupt()中断它时;线程的中断标记会被设置 为true,并且它会立即从选择操作中返回。
如果不属于前面所说的情况,那么通过interrupt()中断线程时,它的中断标记会被设置为 “true”。
中断一个“已终止的线程”不会产生任何操作。
2. 终止线程的方式
Thread中的stop()和suspend()方法,由于固有的不安全性,已经建议不再使用!
下面,我先分别讨论线程在“阻塞状态”和“运行状态”的终止方式,然后再 总结出一个通用的方式。
2.1 终止处于“阻塞状态”的线程
通常,我们通过“中断”方式终止处于“阻塞状态”的线程。
当线程由于被调用了sleep(), wait(), join()等方法而进入阻塞状态;若此时调用线程的interrupt ()将线程的中断标记设为true。由于处于阻塞状态,中断标记会被清除,同时产生一个 InterruptedException异常。将InterruptedException放在适当的为止就能终止线程,形式如下:
@Override public void run() { try { while (true) { // 执行任务... } } catch (InterruptedException ie) { // 由于产生InterruptedException异常,退出while(true)循环,线程终止! } }
说明:在while(true)中不断的执行任务,当线程处于阻塞状态时,调用线程的interrupt()产生 InterruptedException中断。中断的捕获在while(true)之外,这样就退出了while(true)循环!
注意:对InterruptedException的捕获务一般放在while(true)循环体的外面,这样,在产生异常时就 退出了while(true)循环。否则,InterruptedException在while(true)循环体之内,就需要额外的添加退 出处理。形式如下:
@Override public void run() { while (true) { try { // 执行任务... } catch (InterruptedException ie) { // InterruptedException在while(true)循环体内。 // 当线程产生了InterruptedException异常时,while(true)仍能继续运行!需要手动退出 break; } } }
说明:上面的InterruptedException异常的捕获在whle(true)之内。当产生InterruptedException异 常时,被catch处理之外,仍然在while(true)循环体内;要退出while(true)循环体,需要额外的执行退 出while(true)的操作。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索linux. 线程 异常
, 线程
, 阻塞
, 状态
, true
, interrupt
, 急 终止线程
, 终止线程
, java线程阻塞中断
, 终止多线程
, 中断线程
, interruptedexception
, 终止循环体
可控的线程中断
,以便于您获取更多的相关知识。