Callable接口原理以及测试
Posted dengw125792
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Callable接口原理以及测试相关的知识,希望对你有一定的参考价值。
package t1;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("*****come in Callable");
TimeUnit.SECONDS.sleep(3);
return 1000;
}
}
public class CallableDemo {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// FutureTask为RunnableFuture的实现类,RunnableFuture为Runnablede的子接口
// FutureTask的构造函数参数是Callable接口。
// 这样Thread的构造函数就可以使用Runnablede的包含Callable构造的子类FutureTask来构造
// 这是一种适配器模式
// FutureTask的get()方法可以获取Callable线程执行后的返回值,FutureTask出现的原因
// 就是分解任务再合并结果
// FutureTask的get()会出现阻塞,所以一般放在最后获取结果,也可采用自旋锁的方式while循环。
FutureTask<Integer> futureTask = new FutureTask<>(new MyCallable());
new Thread(futureTask).start();
new Thread(futureTask).start();// 多个线程抢1个futureTask,不会执行两次,如果非要执行两次,需要开两个futureTask
int result1 = 100;
while (futureTask.isDone())// 这儿阻塞,一旦计算完成,就取值
;
int result2 = futureTask.get();
System.out.println(result1 + result2);
}
}
输出结果:
*****come in Callable
1100
以上是关于Callable接口原理以及测试的主要内容,如果未能解决你的问题,请参考以下文章
Future接口和Callable接口以及FeatureTask详解
基于接口回调详解JUC中Callable和FutureTask实现原理
Java多线程之Callable接口与Runnable的实现以及选择