【问题标题】:Catched exception in parent thread interrupting its flow when child process fails当子进程失败时,父线程中捕获的异常中断其流程
【发布时间】:2015-11-29 13:49:36
【问题描述】:

我遇到了如下情况。

主类

event.addListener(Event e){
  if (e == EXPECTED_EVENT) 
      Future<?> result = executorService.submit(myTask);
  }
}
doSomething()
doSomethingElse()
doMoreStuff()

如果其中一项任务失败,有什么方法可以中断主流程?

我不知道在哪里以及如何精确同步 Exception 部分:

    try {
        Object result = ((Future<?>) expectedFutureTask).get();
    } 
    catch (InterruptedException e ) { /* Task was interupted/stopped */}
    catch (CancellationException e) { /* Task was cancelled */} 
    catch (ExecutionException e) { //Task threw an Exception
        throw e.getCause();
    }

有什么简洁的设计可以满足这个需求吗?

【问题讨论】:

  • 有点不清楚是什么问题。您要解决的具体问题是什么?
  • 我放了一个主类,它通过监听器将任务提交给 executionService。然后我问“如果其中一个任务失败,有什么方法可以中断主流程?”。我以为说的很清楚了,还有什么不明白的?
  • 您显示的代码中断了主要流程。这就是你现在想要的吗?没有任何神奇的方法可以让代码继续它的业务,但突然抛出一个 InterrruptedByFailingChildTaskException 然后进入一个异常处理程序。您的主代码需要检查(不时/不断地)是否满足需要采取行动的条件。您可以创建一个调用父线程的Thread.interrupt() 方法的执行程序(或可监听的future),但问题仍然存在,您需要做一些检查中断条件的事情。
  • 谢谢,我就是这么问的!

标签: multithreading concurrency architecture java-8 java.util.concurrent


【解决方案1】:

考虑使用CompletableFuture,它允许您将任务组合为 DAG,根据需要同步或异步执行它们并合并结果/异常。

然后可以通过canceling他们来完成图中期货的中断。

【讨论】:

  • 令人大开眼界,我正在研究它,如果它适合我​​的需要,我会检查它
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 2014-05-20
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 2014-10-06
相关资源
最近更新 更多