Callable
- 可以有返回值
- 可以抛出异常
- 方法不同,run() / call()
public class CallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyThread myThread = new MyThread();
FutureTask futureTask = new FutureTask<>(myThread);
new Thread(futureTask,"A").start();
String str =(String) futureTask.get();
System.out.println("返回结果"+str);
}
}
class MyThread implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("执行call");
return "执行call";
}
}
执行结果:
执行call
返回结果执行call
解释: 为什么实现Callable的类需要用FutureTask来包装一下才可以放入线程中启动呢?
因为Thread只能接受Runnable,很显然Callable就不能直接放入Thread中,翻看Runnable源码,可以找到Runnable有一个实现类FutureTask,可以放入Callable,所以需要通过FutureTask来包装一下Callable,让其跟Runnable挂上关系
细节:
- 有缓存
- 结果可能需要等待,会阻塞