java :中断线程

当线程的 run 方法执行方法体中最后一条语句后 , 并经由执行 return 语句返冋时 , 或者出现了在方法中没有捕获的异常时

, 线程将终止 。 在 Java 的早期版本中 , 还有一个 stop 方法 , 其他线程可以调用它终止线程。 但是 , 这个方法现在已经被弃用了 。

没有可以强制线程终止的方法。 然而 , interrupt 方法可以用来请求终止线程 。当对一个线程调用 interrupt 方法时, 线程的中断状态将被置位 。 这是每一个线程都具有的 boolean 标志。 每个线程都应该不时地检査这个标志 ,以判断线程是否被中断。要想弄清中断状态是否被置位, 首先调用静态的Thread . currentThread 方法获得当前线程 , 然后调用 islnterrupted 方法 :

while ( ! Thread . currentThread () . islnterrupted ( ) && more work to do )
{
do more work

}

但是,如果线程被阻塞 , 就无法检测中断状态。 这是产生 InterruptedExceptioii异常的地方。 当在一个被阻塞的线程 ( 调用 sleep或 wait ) 上调用 interrupt 方法时, 阻塞调用将会被Interrupted Exception 异常中断 。 ( 存在不能被中断的阻塞 I / O调用 , 应该考虑选择可中断的调用。

没有任何语言方面的需求要求一个被中断的线程应该终止 。 中断一个线程不过是引起它的注意。 被中断的线程可以决定如何响应中断 。 某些线程是如此重要以至于应该处理完异常后,继续执行, 而不理会中断 。 但是 , 更普遍的情况是 , 线程将简单地将中断作为一个终止的请求。 

如果在每次工作迭代之后都调用 sleep 方法 ( 或者其他的可中断方法 ) , islnterrupted 检测既没有必要也没有用处 。 如果在中断状态被置位时调用 sleep 方法 , 它不会休眠 。 相反 , 它将清除这一状态 (!) 并拋出 IntemiptedException 。 因此 , 如果你的循环调用 sleep , 不会检测中断状态。

注释 : 有两个非常类似的方法, interrupted和 islnterrupted。 Interrupted方法是一个静态方法, 它检测当前的线程是否被中断 。而且 , 调用 interrupted 方法会清除该线程的中断状态。 另一方面 , islnterrupted方法是一个实例方法, 可用来检验是否有线程被中断 。 调用这个方法不会改变中断状态。 

•void interrupts ()
向线程发送中断请求。 线程的中断状态将被设置为 true 。 如果目前该线程被一个 sleep调用阻塞, 那么 , InterruptedException异常被抛出。
•static boolean interrupted ()
测试当前线程 ( 即正在执行这一命令的线程 ) 是否被中断。 注意 , 这是一个静态方法 。这一调用会产生副作用 —它将当前线程的中断状态重置为 false。
•boolean islnterrupted ()测试线程是否被终止。 不像静态的中断方法 , 这一调用不改变线程的中断状态 。
•static Thread currentThread ( )
返回代表当前执行线程的 Thread 对象 。

猜你喜欢

转载自blog.csdn.net/qq_15140841/article/details/80155160