首先来看看官方文档:
理一理Runnable和Callable的不同点
1.可以有返回值
2.可以抛出异常
3.方法不同,run()/call()
底层分析为什么Callable可以有返回值
再来说一说Callable和Thread和Runnable的关系:
用一个图来形象说明下:
在Thread源码中跟Callable是没有联系的,但是Callable又想实现Thread的功能,那只能通过Runnable作为中间人
搭桥
测试代码:
package com.Callbale;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* class MyThread implements Runnable{
*
* @Override
* public void run() {
*
* }该方式,没有返回值,只能开线程,而不能接收
*/
public class CallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//new Thread(new MyThread()).start();
//new Thread(new FutureTask() {}).start();
//new Thread(new FutureTask(Callable) {}).start();
//线程启动的方式有且只有一个
// new Thread().start(); //怎么启动Callable
MyThread myThread = new MyThread();
FutureTask futureTask = new FutureTask<>(myThread); //适配类
new Thread(futureTask).start();
new Thread(futureTask).start();//结果会被缓存,提高效率
//这个get方法可能会产生阻塞.解决方法:异步通信
String o = (String) futureTask.get();//获取Callable的返回结果
System.out.println(o);
}
}
class MyThread implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println(Thread.currentThread().getName()+":call()");
//假如是一个耗时的操作的话,返回结果会等很久
return "qiuzhikang";
}
}
细节:
1.有缓存
2.结果需要等待,会阻塞!