java併發學習04---Future模式
阿新 • • 發佈:2018-11-17
由於Future模式在平常看到的程式碼中用的比較多,所以就先小結下這個模式,後面再來看併發容器中的集合類。
JDK中的Future模式:
Future,既是未來的意思,那麼這個模式的意思呢,就是說這個任務我現在並不會馬上做完,你現在先去做點別的,等我做好了再通知你,聯絡“未來“ 這個詞的意思就是說在將來的某個時刻,我把東西做好了,然後再返回給你。
先來看一下類圖:
(FutureTask 和 Callable之間應該還有一個依賴關係,但是)
通過類圖我們可以知道:
Future是一個介面,擁有get方法,你通過get()方法可以可以取得返回值,而RunnableFuture介面 在繼承Future介面的同時又繼承了Runnable介面,那麼RunnableFuture又可以作為Runnable物件開啟一個執行緒,FutureTask類則實現了這些方法。
程式碼演示:
用了官網的程式碼,為了方便演示添加了一些輸出的語句
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返回結果為止。
最後的執行結果:
一個耗時大概5s的操作開始暗中進行 等待的時候咱們乾點別的, other things: 1s other things: 2s other things: 3s other things 搞定,現在去看看耗時的操作搞完沒 耗時操作還沒有完成,咱們再等等 耗時的操作已經完成,結果是:01234 Process finished with exit code 0