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

因爲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
相關文章
相關標籤/搜索