当前位置: 首页 > 面试题库 >

为什么在Callable中设置中断位

通正平
2023-03-14
问题内容

因此,该资源(http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html)建议在该线程不处理中断本身时将其设置为“
这样,调用堆栈中更高级别的代码就可以了解中断并在需要时对其进行响应 。”

假设我正在使用ExecutorService在其他线程中运行某些内容。我构造一个Callable并将此Callable传递到ExecutorService.submit()中,该方法返回一个Future。如果Callable被中断,然后重置中断位,则在调用Future.get()时,关联的Future将不会引发InterruptedException。因此,如果此Future是主线程访问已生成线程的唯一方法,那么在Callable中设置中断位的目的是什么。

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?

问题答案:

您是正确的,在这种情况下,不会在两个线程之间传递中断标志(这是出于任何原因设计内置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/developer works/Java/library/j-jtp 05236/index . html)建议,当线程本身不处理中断时,在线程中设置中断位,“以便调用堆栈中更高层的代码可以了解到中断,并在需要时做出响应。” 假设我正在使用执行器服务在不同的线程中运行某些内容。我构造了一个可调用的,并将这个可调用传递给执行器服务.subm

  • 问题内容: 既然清楚了什么是元类,就有一个相关的概念,我一直都在使用它,而并不知道它的真正含义。 我想每个人都在括号中犯了一个错误,导致了“对象不可调用”异常。而且,使用并导致怀疑这种血腥的用途。 您能给我一些解释,包括魔术方法的例子吗? 问题答案: 可调用对象是可以调用的任何东西。 所述内置的可调用(在)检查该参数可以是: 具有方法的类的实例或 是具有非成员的类型,该成员以其他方式指示可调用性(

  • 我有一个类实例,上面有一个字段。我在对象上设置了这个实例。我需要在Nashorn中设置字段,以便在Java中调用。我该如何在Nashorn脚本中设置此字段? 脚本是这样调用的: 在脚本中,我需要在全局对象上设置字段: 我已经看到了(建议重复)如何使用Nashorn引擎调用Java对象的问题,但这个问题是关于从Nashorn脚本调用Java方法,而这个问题是关于在Nashorn脚本中设置一个可调用的

  • 问题内容: 在Java中设置断点如何工作?它仅基于源文件名和行号吗?类或方法名称是否也存在? 如果调试器中有旧版本的源代码并设置了断点,则逐步执行时光标会关闭。距离有多远?它会进入错误的方法中吗(如果该文件中有多个类,甚至是错误的类)? 当JVM中有多个同名的类时,会发生什么情况(如果您有多个类加载器,可能会发生这种情况)?他们都得到断点了吗? 在Web应用程序容器中,是否可以仅为一个Web应用程

  • 我想使用ExecutorService来运行一系列相同的可运行/可调用任务。我到处找了一个教程或示例,但没有涉及到实际设置现有Runnable/Callable对象的值,然后使用submit()将该对象发送回ExecutorService。 基本上,我想做的是: 获取服务器列表。 遍历服务器列表,调用获取每个主机上的数据。 将数据收集到服务器bean中以存储在数据库中。 所以,现在,有10,000

  • 什么是中断 中断是我们在操作系统上首先实现的功能,因为它是操作系统所有功能的基础。假如没有中断,操作系统在唤起一个用户程序之后,就只能等到用户程序执行完成之后才能继续执行,那操作系统完全无法进行资源调度。 一个比喻 操作系统就像家长,他将孩子(用户程序)送到学校(开始运行)之后便不再管。 但是如果孩子闯了祸,老师(硬件)就找到家长,这便是异常 孩子的作业可能需要家长来签字(系统调用),他就会主动找