【发布时间】:2010-12-13 20:44:51
【问题描述】:
假设我有以下代码:
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(myRunnable);
现在,如果 myRunnable 抛出 RuntimeExcpetion,我该如何捕捉它?一种方法是将我自己的ThreadFactory 实现提供给newSingleThreadExecutor(),并为由此产生的Threads 设置自定义uncaughtExceptionHandlers。另一种方法是将myRunnable 包装到包含try-catch 块的本地(匿名)Runnable。也许还有其他类似的解决方法。但是……总觉得这很脏,我觉得不应该这么复杂。有干净的解决方案吗?
【问题讨论】:
-
老实说,我质疑捕获不同线程中抛出的异常的意义。当前线程是否必须
join线程并等待抛出异常?你没有在问题中提到这一点。 -
@BalusC:将异常从工作线程编组回调用线程是许多应用程序的常见要求。例如,UI 应用程序可能会调用 SwingWorker 线程来进行一些后台处理。如果处理失败,则需要将异常传递回 Event Dispatch 线程。
-
这是一个常见的要求。线程 1 生成一些工作,通过线程 2 执行它,但需要了解它是否成功(即抛出异常)。 Executor 框架可以帮助您解决这个问题。
-
嗯,其实我还没想过这么多。我只是好奇一般来说如何解决这个问题。但是人们似乎对下面的
submit()和Future有一些很酷的说法:-)
标签: java concurrency executor runtimeexception