一 Callable接口和Runnable接口相似,都是执行新线程的方法。
区别:
1. Callable需要实现call方法,而Runnable需要实现run方法;
2. Callable与executors联合在一起,在任务完成时可立刻获得一个更新了的Future,runable无返回值
Future接口,一般都是取回Callable执行的状态用的。其中的主要方法:
cancel,取消Callable的执行,当Callable还没有完成时
get,获得Callable的返回值 (根据新建callable时候的泛型,这里直接获取。比如:
public class CallAbleTestThread implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println(Thread.currentThread().getName());
return Thread.currentThread().getName()+",返回了";
}
}
// 构造一个线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.DiscardOldestPolicy());
System.out.println(threadPool.submit(new CallAbleTestThread()).get());
这里打印:pool-2-thread-1,返回了
isCanceled,判断是否取消了
isDone,判断是否完成
3.线程池调用时,Runnable是用execute方法执行无返回值,Callable用submit执行返回一个Future
Future<String> fu = threadPool.submit(new CallAbleTestThread());
threadPool.execute(new RunAbleTestThread());
二。线程池的关系
ThreadPoolExecutor extends AbstractExecutorService implements(interface) ExecutorService extends (interface) Executor
有时候使用Executors构造线程池,例如:
ExecutorService executor = Executors.newFixedThreadPool(10);
实际上构造的也是一个ThreadPoolExecutor,源码如下:
总:execute方法是由 Executor接口定义,submit方法是由ExecutorService接口定义。
所以ThreadPoolExecutor 必然可使用 submit获取线程的返回值