Curious exception propagation to main thread
在下面的例子中,为什么两个异常都传播到主线程?
(这是我配置为在调用stop()时抛出运行时异常的测试):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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"); } } |
我希望只有第一个被传播,因为第二个被吞下这个设置(由于它通过循环遍历数组列表顺序等待第一个runnable)。
如果我们只调用runnable2.stop(),可以看到这种吞咽的一个例子 - 在这种情况下根本没有显示任何东西。
为什么runnable2的例外根本打印?
我还要提一下,当在每个线程上调用stop()时,在抛出异常以允许仍然调用期货循环之前,方法内部会有一个暂停。
如果你只在第二个上调用
In the following case, why is it that both exceptions get propagated to the main thread?
这就是
因此,如果第二个作业首先抛出异常,它将存储在与作业关联的
如果您愿意,可以查看
1 2 3 4 5 6 7 8 9 10 11 12 | public void run() { ... try { // Gray: this calls your job, storing the result result = c.call(); ran = true; } catch (Throwable ex) { result = null; ran = false; // this puts ex into result and sets the state to EXCEPTIONAL setException(ex); } |
然后:
1 2 3 4 5 6 7 8 9 | public V get() throws InterruptedException, ExecutionException { ... Object x = outcome; if (s == NORMAL) return (V)x; if (s >= CANCELLED) throw new CancellationException(); throw new ExecutionException((Throwable)x); |
因此,当运行结束时,