Runnable自 Java 1.0 以来一直存在,但Callable仅在 Java 1.5 中引入,目的就是为了来处理Runnable不支持的用例。Runnable 接口不会返回结果或抛出检查异常,但是Callable 接口可以。所以,如果任务不需要返回结果或抛出异常推荐使用 Runnable 接口,这样代码看起来会更加简洁。

    工具类 Executors 可以实现 Runnable 对象和 Callable 对象之间的相互转换。(Executors.callable(Runnable task)或 Executors.callable(Runnable task,Object resule))。

    1. Runnable.java
    2. @FunctionalInterface
    3. public interface Runnable {
    4. /**
    5. * 被线程执行,没有返回值也无法抛出异常
    6. */
    7. public abstract void run();
    8. }
    1. Callable.java
    2. @FunctionalInterface
    3. public interface Callable {
    4. /**
    5. * 计算结果,或在无法这样做时抛出异常。
    6. * @return 计算得出的结果
    7. * @throws 如果无法计算结果,则抛出异常
    8. */
    9. V call() throws Exception;
    10. }