【问题标题】:Will exceptions be caught in following tasks?在以下任务中是否会捕获异常?
【发布时间】:2018-09-06 01:46:09
【问题描述】:
try {
    for (final Future<Boolean> bool : threadPool.invokeAll(tasks)) {
        if (!bool.get()) {
            return false;
        }
    }
    return true;
} finally {
    threadPool.shutdownNow();
    threadPool.awaitTermination(
        IMPORT_THREADS_AWAIT_TERMINATION_TIMEOUT.toMillis(), TimeUnit.MILLISECONDS);
}

假设任务可以抛出异常。假设有 5 个任务,第 5 个任务抛出异常,但循环中的第 1 个任务返回 false。 (和循环中断)。如果该任务引发异常,我想捕获它并执行一些清理逻辑。我想知道我的逻辑永远不会捕获任务 5 引发的异常,因为我从任务 1 的循环中中断

  1. 在这种情况下,我们会遇到任务 5 抛出的异常吗?

  2. 显示 threadPool.shutdownNow() 抛出任务 5 的异常?

【问题讨论】:

  • 不能用两个try catch块吗?
  • 你找到了原因,为什么线程内的异常不能传播到调用线程。这两个线程不共享一个共同的调用堆栈,这就是为什么调用线程将具有完全不同的上下文,很可能在您的 try/catch 块之外。

标签: java multithreading exception-handling executorservice


【解决方案1】:

exception 将被task5 抛出,但executor 将捕获它并将其包装为ExecutionException。

在这种情况下,除非您调用futureOfTask5.get(),否则exception 将不会被重新抛出。

您可以在task5的call方法中添加try...catch块来记录它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多