我理解callable的调用可以将异常抛给调用它的父方法,而runnable不是这样。
我想知道如何因为它是一个线程方法而且是线程堆栈的最底层方法。
答案 0 :(得分:15)
Callable
的要点是将您的异常抛出到您的调用线程中,例如,当您获得Future
的{{1}}时,您提交了callable
。
public class CallableClass implements Callable<String> {
...
}
ExecutorService executor = new ScheduledThreadPoolExecutor(5);
Future<Integer> future = executor.submit(callable);
try {
System.out.println(future.get());
} catch (Exception e) {
// do something
}
答案 1 :(得分:6)
Callable.call()
无法成为最底层的堆栈框架。它总是由另一个方法调用,然后捕获异常。 Callable
通常应该用于异步计算值,然后使用Future
对象获取它们。操作可能抛出异常,当您尝试获取Future
的值时,该异常稍后会重新抛出。
Runnable
只是运行一个不返回任何内容的操作。所有异常处理都应该在Runnable
内完成,因为不清楚应该如何处理Runnable.run()
中抛出的任何异常。 (Callable
的例外情况通常会通过Future
)