2

如果我在 a 中运行一个线程,ExecutorService有没有办法知道该线程在开始执行时没有引发异常?

4

4 回答 4

5

根据JavaDoc,您可以使用执行器提交您的可运行文件submit()

    ExecutorService service = Executors.newSingleThreadExecutor();
    Future f = service.submit(new Runnable() {
        @Override
        public void run() {
            throw new RuntimeException("I failed for no reason");
        }
    });
    try {
        f.get();            
    } catch (ExecutionException ee) {
        System.out.println("Execution failed " + ee.getMessage());
    } catch (InterruptedException ie) {
        System.out.println("Execution failed " + ie.getMessage());
    }

此方法仅在您的异常未选中时才有效。如果您检查了异常,请重新将它们包裹在 a 中RuntimeException或使用Callable代替Runnable接口。

于 2013-03-01T15:14:45.723 回答
2
ExecutorService executor = Executors.newFixedThreadPool (4);

Future <?> future = executor.submit (new Runnable ()
{
    @Override
    public void run () {
        // while (true);
        throw new RuntimeException ("Something bad happend!");
    }
});

Thread.sleep (1000L);

try
{
    future.get (0, TimeUnit.MILLISECONDS);
}
catch (TimeoutException ex)
{
    System.out.println ("No exceptions");
}
catch (ExecutionException ex)
{
    System.out.println ("Exception happend: " + ex.getCause ());
}
于 2013-03-01T15:11:52.017 回答
0

get()如果正在执行任务的线程中存在异常,则Future抛出方法。ExecutionException实际发生的异常包含在此异常中。

于 2013-03-01T15:19:41.853 回答
0

刚刚在你的另一个问题中说了这个:使用你自己的ThreadPoolExecutor而不是Executors. 然后覆盖afterExecuteTPE 提供的钩子,对异常做任何你想做的事情。

于 2013-03-01T15:07:08.403 回答