首先看一下下邊這段代碼,很簡單直接拿去跑一下,註釋也很全。有兩種方式分別是線程池執行和Trhead執行 import java.util.concurrent.*; public class JxdFutureTask { public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<String> futureTask = new FutureTask<String>(()->"FutureTask 線程池 ---");//實現Callable接口 //方法一,線程池方式獲取結果 ExecutorService executorService = Executors.newCachedThreadPool(); //創建線程池 executorService.submit(futureTask); //提交futureTask //獲取計算結果 String result =futureTask.get(); System.out.println(result); executorService.shutdown();//關閉線程 //方法二,Thread方式獲取結果 FutureTask<String> futureTaskThread= new FutureTask<String>(()->"FutureTask Thread ---");//實現Callable接口 Thread t1 = new Thread(futureTaskThread); t1.start(); String resultThread =futureTaskThread.get(); System.out.println(resultThread); /**ThreadPoolExecutor * 提供的三種sumit * * 1.sumit(Runnable task) 提交Runnable 的run()沒有返回值,所以sumit(Runnable task)這個 * 方法返回的Future僅可用來斷言任務已經結束,類似於Thread.join()。 * 2.sumit(Callable<T> task) Callable 只有一個call()方法,並且這個方法是由返回值的,所以這個方法 * 返回的Future對象可以通過調用其get()方法來獲取任務執行結果 * * FutureTask 的使用 * 1.構造參數 提供兩種方式和上邊的一樣 不在贅述。 * 2.FutureTask實現了Runnable 和Future接口 * new FutureTask<>(Callable<V> callable) * new FutureTask<>(Runnable task,V result) * */ } }
實際寫一段代碼小Demo ,加入我們現在需要做紅燒魚,步驟如下圖所示
任務1的代碼 import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; public class TeaTask1 implements Callable<String> { @Override public String call() throws Exception { System.out.println("開始殺魚"); TimeUnit.SECONDS.sleep(3);//假設執行時間1秒 System.out.println("執行去魚鱗,清洗內臟"); TimeUnit.SECONDS.sleep(3);//假設執行時間1秒 System.out.println("鯉魚清洗完成"); System.out.println("把鯉魚送到廚房"); TimeUnit.SECONDS.sleep(3); return "鯉魚"; } } 任務二的代碼 import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; public class TeaTask2 implements Callable<String> { FutureTask<String> futureTask; public TeaTask2(FutureTask<String> futureTask) { this.futureTask = futureTask; } @Override public String call() throws Exception { System.out.println("刷鍋"); TimeUnit.SECONDS.sleep(1);//假設執行時間1秒 System.out.println("準備調料"); TimeUnit.SECONDS.sleep(1);//假設執行時間1秒 System.out.println("起鍋燒油"); TimeUnit.SECONDS.sleep(1);//假設執行時間1秒 String result = futureTask.get();//獲取另一個線程的結果 System.out.println("開始做菜獲取" + result); TimeUnit.SECONDS.sleep(1);//假設執行時間1秒 return "紅燒" + result + "上桌"; } }
開始測試
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; public class TeaTest { public static void main(String[] args) throws ExecutionException, InterruptedException { TeaTask1 tea1 = new TeaTask1(); FutureTask<String> teaTask1 = new FutureTask<>(tea1);//執行清晰鯉魚的任務 TeaTask2 tea2 = new TeaTask2(teaTask1); FutureTask<String> teaTask2 = new FutureTask<>(tea2);//執行做紅燒鯉魚的任務 ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(teaTask1); executorService.submit(teaTask2); System.out.println(teaTask2.get());//完成 executorService.shutdown(); } }
解釋結果:
開始殺魚
刷鍋
準備調料
起鍋燒油
執行去魚鱗,清洗內臟
鯉魚清洗完成
把鯉魚送到廚房
開始做菜獲取鯉魚
紅燒鯉魚上桌