线程的中断

2021-12-07 16:23:20 浏览数 (2)

中断是对线程的一个指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何响应中断,但是线程终止是很常见的。这是本节课要强调的用法。

线程通过在要被中断的线程对象上调用interrupt来发送中断。为了让中断机制正常工作,被中断的线程必须支持自己的中断。

Supporting Interruption

线程如何支持自己的中断?这取决于它当前正在做什么。如果线程频繁地调用抛出InterruptedException的方法,它只需在捕获该异常后从run方法返回。例如,假设SleepMessages示例中的中心消息循环在线程的Runnable对象的run方法中。那么它可能会被修改如下以支持中断:

代码语言:javascript复制
for (int i = 0; i < importantInfo.length; i  ) {
     // Pause for 4 seconds   
     try {
         Thread.sleep(4000);
     } catch (InterruptedException e) {
         // We've been interrupted: no more messages.         
         return;
     }
     // Print a message   
     System.out.println(importantInfo[i]);
 }

许多抛出InterruptedException的方法(如sleep)被设计成取消当前操作,并在接收到中断时立即返回。

如果线程很长时间没有调用抛出InterruptedException的方法,该怎么办?然后,它必须定期调用Thread.interrupted,如果已经接收到中断,该函数返回true。例如:

代码语言:javascript复制
for (int i = 0; i < inputs.length; i  ) {
     heavyCrunch(inputs[i]);
     if (Thread.interrupted()) {
         // We've been interrupted: no more crunching.
         return;
     }
}

在这个简单的示例中,代码只是测试中断并在收到中断后退出线程。在更复杂的应用程序中,抛出InterruptedException可能更有意义:

代码语言:javascript复制
if (Thread.interrupted()) {
    throw new InterruptedException();
}

这允许中断处理代码集中在catch子句中。

中断状态标志

中断机制是使用一个内部标志来实现的,这个标志被称为中断状态。调用Thread.interrupt设置这个标志。当线程通过调用静态方法thread .interrupted来检查中断时,中断状态将被清除。一个线程使用非静态的isInterrupted方法来查询另一个线程的中断状态,它不会改变中断状态标志。

0 人点赞