因爲Future模式在日常看到的代碼中用的比較多,因此就先小結下這個模式,後面再來看併發容器中的集合類。java
JDK中的Future模式:併發
Future,既是將來的意思,那麼這個模式的意思呢,就是說這個任務我如今並不會立刻作完,你如今先去作點別的,等我作好了再通知你,聯繫「將來「 這個詞的意思就是說在未來的某個時刻,我把東西作好了,而後再返回給你。app
先來看一下類圖:ide
(FutureTask 和 Callable之間應該還有一個依賴關係,可是)ui
經過類圖咱們能夠知道:spa
Future是一個接口,擁有get方法,你經過get()方法能夠能夠取得返回值,而RunnableFuture接口 在繼承Future接口的同時又繼承了Runnable接口,那麼RunnableFuture又能夠做爲Runnable對象開啓一個線程,FutureTask類則實現了這些方法。線程
代碼演示:code
用了官網的代碼,爲了方便演示添加了一些輸出的語句對象
import java.util.concurrent.*; public class Lesson01_Future { public static void main(String[] args) throws InterruptedException { Callable searcher = new Callable() { @Override public String call() throws Exception { System.out.println("一個耗時大概5s的操做開始暗中進行\n"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 5; i++) { sb.append(i); Thread.sleep(1000); } return sb.toString(); } }; ExecutorService excutor = Executors.newFixedThreadPool(1); FutureTask<String> future = new FutureTask<String>(searcher); //這裏searcher就開始執行了 excutor.submit(future); Thread.sleep(100); //確保searcher已經開始執行 //在searcher執行的時候,咱們能夠去幹點別的 //使用一個sleep方法模擬一個耗時操做 System.out.println("等待的時候我們乾點別的,"); for (int i = 0; i < 3 ; i++) { System.out.println("other things: " + (i+1) + "s"); Thread.sleep(1000); } System.out.println("other things 搞定,如今去看看耗時的操做搞完沒\n"); //如今再來看它搞定沒,搞定了就輸出它的值 //注意沒搞定的話,線程就必須阻塞在這裏等着它搞定,不能繼續去作其餘的事情了 try { if(future.isDone()) { System.out.println("耗時的操做已經完成,結果是:" + future.get()); } else { System.out.println("耗時操做尚未完成,我們再等等"); System.out.println("耗時的操做已經完成,結果是:" + future.get()); } } catch (ExecutionException e) { e.printStackTrace(); } excutor.shutdown(); } }
向線程池提交searcher以後,模擬的耗時操做就開始進行了,而後主線程仍是能夠執行其餘的任務,可是一旦你使用了future.get()方法,線程就必須阻塞住直到future返回結果爲止。blog
最後的執行結果:
一個耗時大概5s的操做開始暗中進行 等待的時候我們乾點別的, other things: 1s other things: 2s other things: 3s other things 搞定,如今去看看耗時的操做搞完沒 耗時操做尚未完成,我們再等等 耗時的操做已經完成,結果是:01234 Process finished with exit code 0