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

时间:2018-10-24 15:16:16

标签: 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");
}

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

1 个答案:

答案 0 :(得分:4)

它没有被吞下,它在那里:

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");
    }

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

  

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