6.Callable
感谢秦疆老师的JUC并发编程视频,更多了解哔哩哔哩搜索【狂神说Java】。
本文内容源于秦疆老师的JUC并发编程视频教程。给狂神推荐,点赞吧!
Callable
- 可以有返回值
- 可以抛出异常
- 方法不同,run()/ call()
Runnable
FutureTask
测试
package demo5;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
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();
new Thread(futureTask,"B").start();
//获取Callable的值
// 这个get方法可能会产生阻塞!把他放在最后
Integer result = (Integer) futureTask.get();
//或者使用异步通信
System.out.println(result);
}
}
class MyThread implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println("调用call()方法!");
//耗时的操作
return 1024;
}
}
分析:
- 上面是使用Callable接口简单实现多线程,使用这个接口要使用FutrueTask类作为简单的适配类,因为Thread构造方法只能接受Runnable接口参数,下面源码中看出FutrueTask的对象为什么也能作为Runnable型参数传给Thread构造方法
- 再分析一下结果,可以看到明明启动了a,b两个线程,但是只输出了一个线程的结果,这是因为运行的结果会被缓存,使得线程的执行效率变高。还有一点就是获取线程返回值的get方法可能会产生阻塞,一般放在最后或者使用异步通信来处理。
细节:
- 有缓存
- 结果可能需要等待,会阻塞!