Callable和Future原理分析
Runnable & Callable
java提供两种线程实现方式Runnable和Callable。Runnable线程提交后没有返回值,主线程无法感知线程的执行结果。Callable提供返回值,通过Future的回调模式实现对线程计算结果的监听。那么Future是如何做到这一点的呢,下面通过源码分析一探究竟。
举个例子
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService service = Executors.newSingleThreadExecutor();
// 提交callbale线程,返回Future对象
Future<String> future =service.submit(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(1000*5);
return "Hello";
}
});
// 线程会在此处阻塞,直到Callable线程返回结果
String result = future.get();
// 关闭线程池
service.shutdownNow();
}
源码分析
首先看看Callable被提交到线程池后做了什么操作
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}