当前位置: 首页 > 知识库问答 >
问题:

为什么要在可调用函数中设置中断位

巫英纵
2023-03-14

因此,该资源(http://www . IBM . com/developer works/Java/library/j-jtp 05236/index . html)建议,当线程本身不处理中断时,在线程中设置中断位,“以便调用堆栈中更高层的代码可以了解到中断,并在需要时做出响应。”

假设我正在使用执行器服务在不同的线程中运行某些内容。我构造了一个可调用的,并将这个可调用传递给执行器服务.submit(),它返回一个未来。如果可调用项被中断,然后重置中断位,则当调用 Future.get() 时,关联的未来不会抛出中断异常。那么,如果这个未来是主线程访问生成的线程的唯一方式,那么在可调用中设置中断位的目的是什么?

class MyCallable implements Callable<String> {
  @Override
  public String call() {
    while (!Thread.currentThread().isInterrupted()) {
    }
    Thread.currentThread().interrupt();
    return "blah";
  }
}

 ExecutorService pool = makeService();
 Future<String> future = pool.submit(new MyCallable());
 // Callable gets interrupted and the Callable resets the interrupt bit.
 future.get(); // Does not thrown an InterruptedException, so how will I ever know that the Callable was interrupted?

共有2个答案

章高爽
2023-03-14

中断线程应该终止它,但方式不如kill()脆弱。仅在各种阻塞操作期间检查线程的中断状态。

如果您的线程在其中一个操作期间被中断,则会抛出InterruptedException。当这种情况发生时,您希望尽快干净地退出。那么,如果执行器服务线程中断,Callable应该怎么做?

如果其操作很短,一个有效的选项是正常完成该操作,但在线程上设置中断状态,以便在此操作完成后执行程序服务将关闭。

如果操作较长,则可能需要改为引发异常,告知调用方操作已中断。

许彦
2023-03-14

在这个场景中,中断标志没有在两个线程之间传递是正确的(这就是内置ExecutorService的设计原理)。如果希望主线程看到可调用的中断状态,则必须从调用方法中抛出InterruptedException。

class MyCallable implements Callable<String> {
  @Override
  public String call() {
    // ...
    if(Thread.currentThread().isInterrupted()) {
      throw new InterruptedException();
    }
    return "blah";
  }
}

请注意,在这种情况下,您仍然不会直接从Future.get()获取InterruptedException。因为它是由可调用对象抛出的,它将被包装在ExecutionException中(这是为了让您可以区分可调用对象的中断和主线程的中断)。

 类似资料:
  • 问题内容: 因此,该资源(http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html)建议在该线程不处理中断本身时将其设置为“ 这样,调用堆栈中更高级别的代码就可以了解中断并在需要时对其进行响应 。” 假设我正在使用ExecutorService在其他线程中运行某些内容。我构造一个Callable并将此Callable传

  • 问题内容: 我正在处理一个扩展的类。 这不是我的代码,它在开始构造GUI之前先进行调用。我想知道为什么要这样做,因为我一直只访问超类的方法而不必调用; 问题答案: 对于具有父级的所有类(这是Java中每个用户定义的类),都有一个不带参数的隐式调用,因此通常不需要显式调用。但是,如果父级的构造函数接受参数,并且你希望指定它们,则可以使用参数调用。此外,如果父级的构造函数接受参数,并且没有默认的无参数

  • 问题内容: 我在课堂上有这个功能: 我尝试使用此函数来调用该函数: 问题是编译器希望它看起来像这样: 为什么第一个会导致错误? 问题答案: Swift 2.0更新 :现在,默认情况下,函数的功能与方法相同,并且对于两种方法而言: 第一个参数没有外部名称;和 其他参数的外部名称与内部名称相同。 除此之外,下面的规则仍然适用,只是速记语法已消失。 这是一个更一般的答案:函数在类之外定义为真函数时以及在

  • 问题内容: 今天,当我发现一段Python代码使用内置函数 作为变量标识符来存储列表推导的结果并且没有引发错误时,我偶然发现了这一点,因此我尝试了以下操作: 希望当我问为什么在Python中允许这种行为时,这是一个有效的问题。 或者更好的是,如何确保内置函数的确是真实的而不是不说,因此不会被偶然评估? 问题答案: Python希望您对您的代码负责,这就是为什么。Python没有私有属性,没有受保护

  • 本文向大家介绍为什么要用纯函数?相关面试题,主要包含被问及为什么要用纯函数?时的应答技巧和注意事项,需要的朋友参考一下 在此之前要先了解什么是纯函数,简单来说纯函数的定义有两个: 1.返回的结果只依赖于传入的参数。 2.执行过程中不产生副作用。 在这里就需要了解到什么是副作用 1.改变了外部变量或者对象属性 2.触发任何外部进程 3.发送http请求 4.调用其他有副作用的函数 5.…… 那么我们

  • 问题内容: 我对此代码有疑问:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js 特别: 我猜这是一个两部分的问题。 为什么我需要将句柄更改设置为类的实例,我不能只对handleChange使用静态函数并直接在类中调用它 ? 我不知道这是怎么回事: 谢谢 问题答案: 以相反的顺序回答… 返回