何时应该更喜欢Callable over Runnable?为什么?

时间:2015-08-01 05:23:55

标签: java multithreading file-io runnable callable

在SO上,我发现CallableRunnable之间的所有理论差异都很相似。但是,我不明白为什么Callable在后期版本中被引入? Runnable中的差距/缺陷是什么,Callable能够做什么?任何人都可以解释Callable只是解决方案的情况吗?

2 个答案:

答案 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,如果......

  1. 你需要抛出一个检查过的例外或......
  2. 你需要返回一个对象(当然你可以通过给你的runnable提供一个内部结果对象来模拟这个 - 但是这样更容易)
  3. 例如......

    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