首先说下Callable接口,这个接口只有一个方法如下:
public V call();
和Runnable不同的是,Thread类不会接受一个Callable接口的实现来实现一个线程,而是需要通过Executor接口的实现类来实现。通常是使用Executors这个类。在Executors这个类中,使用static方法,可以获取不同类型的Executor接口的实现。下面可以简单的梳理下关于Executor接口的逻辑关系。
Executor接口中只有一个方法:public void execute(Runnable command),理解来的意思就是执行这个command任务。至于是在一个新的线程还是线程池还是其他的方式,那就要看Executor接口的具体实现了。ExecutorService接口扩充了Executor,新增了许多新的方法,ScheduledExecutorService接口再次扩充了ExecutorService接口,新增了线程调度的相关方法。一些类实现了这些接口,并且可以通过前面所说的Executors这个类,通过static方法获取这些接口的实现类,比如ThreadPoolExecutorScheculedThreadPoolExecutor。
下面说下Future接口,这个接口定义的方法如下,它有一个简单的实现类FutureTask类,可以通过这个类来具体的看下这个接口的设计意图。
boolean cancel(boolean mayInterruptIfRunning)
V get()
V get(long timeout, TimeUnit unit)
boolean isCancelled()
boolean isDone()
从方法中可以看出,我们可一个通过get方法获取线程的计算结果,也可以通过cancel方法来中止这个线程,api文档中指出,如果调用get方法这个线程还没有完成,那么block线程。而且如果只是想用Future的取消线程的方法,那么可以直接返回null。