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

为什么shutdownNow()方法能够在可调用对象内部中断for循环,但在Runnable内部却不能这样做,除非我们专门调用break?

班高明
2023-03-14
@Override public void run() {
    for (int j = 0; j < forLoops; j++) {
        try {
            Thread.sleep(sleepTime);
        } catch (InterruptedException e) {
            break;
        }
    }
}

如果没有中断,代码将先完成for循环,然后停止。

我的问题是为什么我们不需要在MyCallableTaskcall()实现中包含任何中断或返回?我的意思是,为什么代码成功地在call()方法中立即中断for循环,而没有任何额外的指令?

@Override public Void call() throws Exception {
    for (int j = 0; j < forLoops; j++) {
        Thread.sleep(sleepTime);
    }
    return null;
}

共有1个答案

贲俊才
2023-03-14

InterruptedException是已检查的异常。

您必须在方法内部处理它(使用try/catch),或者声明方法抛出它(或超类)。

可运行实现不能抛出像interruptedexception这样的检查异常(其基声明没有throws exceptionthrows interruptedexception);callable可以,因为它的声明可以。

 类似资料:
  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则它可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 我在vue方法中启动Sweatrep时遇到问题。如果我直接在脚本中调用Sweatrep,但当我想在单击按钮时启动Sweatrep时不会发生任何事情(控制台中没有错误)。代码看起来 Vue(Vuetify) 这项工作 不行 我是新的Vue,所以也许错误很容易看到,但我不知道为什么没有工作。 所以问题是:为什么当我点击一个按钮时不能启动sweetalert模式?

  • 问题内容: 我有一个expressjs应用程序,在特定的路由上,我调用了一个函数,该函数通过使用数据库文档作为参数来响应数据库中的用户。我使用基于promise的库,并且想在将数据库文档放入响应中的回调内联。但是当我这样做时程序会失败。有人可以解释为什么吗?我还想知道为什么内联调用才能真正起作用。两种方法和之间有一些根本区别吗? 这是一个有效和无效的示例。假定返回用户文档的承诺。 问题答案: 像这

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 作为一个初学者,我想知道为什么我的仅在放在主块内时有效? 当我有这样的代码时,我不能调用该方法。 方法调用类: 包含以下方法的类:

  • 问题内容: 我想遍历“节日” 的 ArrayList 并使用 get 方法获取其信息,并打印出其所有值。由于某些原因,当我使用此代码时,它将始终选择第“ 0”个值,而不增加循环。 如果我将值硬编码为“ get(1)”,它将获得正确的值,因此我的问题显然是语法。 问题答案: 造成具体问题的原因是,您将灰心丧气的旧式_脚本_和其后继EL混合在一起。它们不共享相同的变量范围。在中不可用 _scriptl