(1)Callable接口更像是Runnable接口的增強版,相比較Runable接口,Call()方法新增捕獲和拋出異常的功能;Call()方法可以返回值<br>
(2)Future接口提供了一個實現類FutureTask實現類,FutureTaks類用來保存Call()方法的返回值,並作為Thread類的target。<br>
(3)調用FutureTask的get()方法來獲取返回值
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* (1)創建Callable接口的實現類,並重寫call()方法,該call()方法作為線程的執行體,且有返回值
* (2)創建了Callable接口的實現類的實例,並用FutureTask()方法包裝對象,該FutureTask()對象實現了
* 將對象的返回值包裝的功能
* (3)使用FutureTask對象將Thread對象的target,創建並啟動線程
* (4)調用FutureTask對象的get()方法獲得子線程執行結束后的返回值
* */
public class Callable_Future implements Callable<Integer> {
@Override
public Integer call() throws Exception { //重寫Callable接口中的call()方法
int i=0;
for(;i<100;i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
return i;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
//創建Callable的對象
Callable_Future ca=new Callable_Future();
FutureTask<Integer> ft=new FutureTask<Integer>(ca);
for(int i=0;i<100;i++) {
//返回值主線程的名稱和執行代號
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20) {
new Thread(ft,"Callable線程").start();
//該方法將導致主線程被阻塞,直到call()方法結束並返回為止
//System.out.println("子線程的返回值"+ft.get());
}
}
try{
System.out.println("子線程的返回值"+ft.get());
}catch (Exception e) {
e.printStackTrace();
}
}
}