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

猜你喜欢

转载自www.cnblogs.com/dengw125792/p/12630075.html