Java源码系列(20) -- Runnable & Callable

November 7, 2018

Runnable

Runnable 接口由需被线程执行的类继承实现,实现类需实现接口中无参数的方法 run

此接口为那些希望在激活时执行代码的对象提供公共协议。例如 Thread 实现 Runnable 接口,当 Thread 激活之后表示线程已经启动且尚未停止。

1
2
3
4
5
6
@FunctionalInterface
public interface Runnable {
    // 当对象实现Runnable接口并用于创建线程
    // 在线程启动时,会引起run方法在独立执行的线程中执行
    public abstract void run();
}

其次,Runnable 也表明实现类在不是 Thread 的子类的情况下,也能变得活跃。实现 Runnable 接口的类不需继承 Thread ,可把本实例传递给 Thread 实例作为运行目标。在多数情况下,如果不需要重写 Thread 方法,应尽量使用 Runnable

Callable

这是返回运行结果值或抛出异常的任务。实现者需定义一个没有参数,且名为 call 的方法。

1
2
3
4
5
6
@FunctionalInterface
public interface Callable<V> {
    // 计算获得结果,或在无法运行时抛出异常
    // V为计算后结果的类型
    V call() throws Exception;
}

CallableRunnable 接口有点类似,均设计为让类实例运行在其他线程上。但是,Runnable 不会返回结果,且不能抛出受检异常。

Executors 类包含一些工具方法,能把其他普通类型转换为 Callable。例如:把 Runnable 转换为 Callable