futureTask用法
深入學習FutureTask 主要講解了如何去使用futureTask來創建多線程任務,並獲取任務的結果。
Callable接口:實現這個接口的類,可以在這個類中定義需要執行的方法和返回結果類型。
MyTask.java類
public class MyTask implements Callable<Object>{
private String args1;
private String args2;
//構造函數,用來向task中傳遞任務的參數
public MyTask(String args1,String args2) {
this.args1=args1;
this.args2=args2;
}
//任務執行的動作
@Override
public Object call() throws Exception {
for(int i=0;i<100;i++){
System.out.println(args1+args2+i);
}
return true;
}
}
FutureTask使用方法
public static void main(String[] args) {
MyTask myTask = new MyTask("11", "22");//實例化任務,傳遞參數
FutureTask<Object> futureTask = new FutureTask<>(myTask);//將任務放進FutureTask裏
//採用thread來開啓多線程,futuretask繼承了Runnable,可以放在線程池中來啓動執行
Thread thread = new Thread(futureTask);
thread.start();
try {
//get():獲取任務執行結果,如果任務還沒完成則會阻塞等待直到任務執行完成。如果任務被取消則會拋出CancellationException異常,
//如果任務執行過程發生異常則會拋出ExecutionException異常,如果阻塞等待過程中被中斷則會拋出InterruptedException異常。
boolean result = (boolean) futureTask.get();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
另外一種方式來開啓線程
ExecutorService executorService=Executors.newCachedThreadPool();
executorService.submit(futureTask);
executorService.shutdown();
多個任務,開啓多線程去執行,並依次獲取返回的執行結果
public static void main(String[] args) {
//創建一個FutureTask list來放置所有的任務
List<FutureTask<Object>> futureTasks=new ArrayList<>();
for(Integer i=0;i<10;i++){
MyTask myTask=new MyTask(i.toString(), i.toString());
futureTasks.add(new FutureTask<>(myTask));
}
//創建線程池後,依次的提交任務,執行
ExecutorService executorService=Executors.newCachedThreadPool();
for(FutureTask<Object> futureTask:futureTasks){
executorService.submit(futureTask);
}
executorService.shutdown();
//根據任務數,依次的去獲取任務返回的結果,這裏獲取結果時會依次返回,若前一個沒返回,則會等待,阻塞
for(Integer i=0;i<10;i++){
try {
String flag=(String)futureTasks.get(i).get();
System.out.println(flag);
} catch (Exception e) {
e.printStackTrace();
}
}
}