在SO上,我发现Callable
和Runnable
之间的所有理论差异都很相似。但是,我不明白为什么Callable
在后期版本中被引入? Runnable中的差距/缺陷是什么,Callable
能够做什么?任何人都可以解释Callable
只是解决方案的情况吗?
答案 0 :(得分:3)
Callable有两个不同之处。它可以返回一个值或抛出一个已检查的异常。
这在使用lambdas时会有所不同,因此即使你没有指定哪一个起诉,编译器也必须解决它。
// the lambda here must be a Callable as it returns an Integer
int result = executor.submit(() -> return 2);
// the lambda here must be a Runnable as it returns nothing
executors.submit(() -> System.out.println("Hello World"));
// the lambda here must be a Callable as an exception could be thrown
executor.submit(() -> {
try (FileWriter out = new FileWriter("out.txt")) {
out.write("Hello World\n");
}
return null; // Callable has to return something
});
答案 1 :(得分:0)
嗯,documentation确实回答了你问题的很大一部分:
Callable
界面与Runnable
类似,两者都是 设计用于其实例可能由其执行的类 另一个线程。但是,Runnable
不会返回结果 不能抛出一个检查过的异常。
所以,你正在使用Callable而不是Runnable,如果......
例如......
ExecutorService service = ... some ExecutorService...;
Callable<Integer> myCallable = new MyCallable( ... some parameters ... );
Future<Integer> future = service.submit( myCallable );
...
Integer myResult = future.get(); // will wait and return return value from callable as soon as done