为什么在ExecutorService实例产生的线程上吞没Java错误?

Som*_*guy 2 java multithreading executorservice

我认为Java错误是严重问题的征兆,因此不应进行处理。那么为什么这段代码运行良好?

public static void main(String[] args)
{
    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<?> future = executor.submit(() -> {throw new AssertionError();});
    while (!future.isDone()) {
    }
    System.out.println("done");
}
Run Code Online (Sandbox Code Playgroud)

我有一个未实现的方法,该方法抛出AssertionError来提醒我实现它,但是它完全被吞没了,没有任何迹象表明存在严重错误。

小智 6

它不被吞没,在那儿:

public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<?> future = executor.submit(() -> {
            throw new AssertionError();
        });
        while (!future.isDone()) {
        }
        try {
            future.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("done");
    }
Run Code Online (Sandbox Code Playgroud)

您在调用get方法时出错,该方法将为您提供计算结果(如果成功的话),否则返回错误。

java.util.concurrent.ExecutionException:java.util.concurrent.FutureTask.report(FutureTask.java:122)处的java.lang.AssertionError在java.util.concurrent.FutureTask.get(FutureTask.java:192)处...

  • @Someguy,您的评论在逻辑上是完全有效的。但是提供给您的API是调用get()以获得计算结果。结果比您预期的要广泛:它结束了,正常结束还是异常结束了,被取消了,甚至开始了还是被取消了?如果考虑并发编程,这些都是关于结果的有效定义(的一部分)。 (3认同)