标签:star one 构造函数 led main 自旋锁 接口 throw err
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
标签:star one 构造函数 led main 自旋锁 接口 throw err
原文地址:https://www.cnblogs.com/dengw125792/p/12630075.html