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(); } } }