本文翻译自英语原文
Callable接口比Runnable接口要新一点,它是在 Java 5 的时候发行的。尽管Callable跟Runnable接口都是设计来代表一个任务(task), 这个任务可以被任意线程执行, 但两者间还是有一些明显的差异. 在我看来, 最主要的差异在于Callable可以在内部的call()方法返回执行的结果, 而Runnable则不行
另一个明显的差别是: 是否有能力抛出checked exception. Callable可以抛出checked exception因为它的call()方法抛出了这个异常.
顺便一提, 有个问题经常是随着经典提问Runnable跟Thread之间的差异?
被问出来的, 通常来说FutureTask要跟Callable一起使用来获取异步任务中的结果.
Callable Vs Runnable 接口
上一节中我已经讨论了Callable跟Runnable之间的主要差异, 有人会问: call()与run()方法的差别有哪些? 下面就来谈谈这个问题, 为了便于理解我一点一点讲:
- Runnable 比 Callable 古老一点, 前者源于 JDK1.0, 后者源于 Java 5.
- Runnable 接口用 run() 方法来描述一个任务(task), 而 Callable 使用 call().
- run()方法不会返回结果, 因为它的返回类型是 void. 而 Callable 是个 支持泛型的接口, 当要实现(implement)一个Callable接口的时候, 就会提供一个返回值类型.
- run()方法不会抛出 checked excep
tion 异常, 而 call() 方法可以
这里还有一个很好的总结