gpt4 book ai didi

java - 奇怪的异常传播到主线程

转载 作者:行者123 更新时间:2023-12-01 08:49:14 25 4
gpt4 key购买 nike

在下面的例子中,为什么两个异常都会传播到主线程?

(这是一个测试,我已将其配置为在调用 stop() 时抛出运行时异常):

    List<Future> futures = new ArrayList<>();
futures.add(executorService.submit(runnable1));
futures.add(executorService.submit(runnable2));
Thread.sleep(1000L); // wait for runnables to run for a while
runnable2.stop();
runnable1.stop();

for (Future future : futures) {
try {
future.get();
} catch(Exception e) {
System.out.println("Exception occurred");
}
}

我希望只有第一个被传播,因为第二个被此设置吞没(因为它通过按顺序循环数组列表来等待第一个可运行对象)。

如果我们只调用 runnable2.stop(),就可以看到这种吞咽的示例 - 在这种情况下,根本不显示任何内容。

为什么要打印 runnable2 的异常?

我还应该提到,当在每个线程上调用 stop() 时,在抛出异常之前该方法内部会有一个暂停,以允许继续调用 futures 循环。

最佳答案

如果您仅对第二个循环调用 stop(),则 for 循环将永远等待第一个循环完成。异常还没有被吞掉;它已被捕获,并且当您的程序在第二个 future 上调用 get() 时将被抛出,但您的程序已挂起等待第一个 future 并且不会到达该点。

关于java - 奇怪的异常传播到主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42488433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com