注意點:FutureTask是Runnable的實現類,它的構造器可以傳Callable接口的實現類。
例子如下:
class MyThread implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName()+" come in Callable");
return 1024;
}
}
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//多個線程只搶一次futureTask,計算結果只有一次,如果要起多個futureTask,就要再創建新的實例,見如下:
FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread());
FutureTask<Integer> futureTask1 = new FutureTask<Integer>(new MyThread());
new Thread(futureTask,"AA").start();
new Thread(futureTask1,"BB").start();
System.out.println("main---------------------");
int number = 100;
// while (!futureTask.isDone()) {
// 此方法跟futureTask.get()效果一樣,都是等待執行完結果
// }
//要求獲得Callable線程的計算結果,如果沒有計算完成就要去強求會導致阻塞,所以最好放最后面執行。
int result = futureTask.get();
System.out.println("******運算結果為:" +(number+result));
}
}
運行結果見下圖: