1. 程式人生 > >java併發學習04---Future模式

java併發學習04---Future模式

由於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