get(long timeout, TimeUnit unit)用來獲取執行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。
而FutureTask即可以作為Runnable又可以作為Future,這樣就既可以用ExecutorService的execute執行任務,也可以用ExecutorService的submit提交任務。
例子1:
Callable、Future實現子線程執行任務,并返回結果,主線程等待子線程結果在進行其他邏輯。(多個子線程并行執行任務,主線程做合并處理參見CompletionService用法 )
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableAndFuture1 {
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
Future<Integer> future = service.submit( new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System. out.PRintln("子線程" + Thread.currentThread().getName() + "在進行計算"); Thread. sleep(3000);
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
return sum;
}
});
System. out.println("主線程" + Thread.currentThread ().getName() + "在執行任務" );
try {
System. out.println("子線程運行結果" + future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System. out.println("所有任務執行完畢" );
}
}