如何使用Future Pattern

如何使用Future Pattern Future Pattern中,
我們實作了Future Pattern, 但是其實Java本身就實作了這個Pattern。
Java提供Callable以及FutureTask這兩個類別讓我們能夠輕易完成Future Patern,
一開始先建立一個Data類別。
public class Data{
        private String data;

        public String getData() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }
}
這個類別很單純的只是把字串設定跟取得。
接著就是我們的主要類別
     private FutureTask<Data> setup(){
        FutureTask<Data> future = new FutureTask<Data>(new Callable<Data>(){

            @Override
            public Data call() throws Exception {
                Data data = new Data();
                for(int i = 1; i <= 10; i++){
                    System.out.println(i * 10 + "%");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                data.setData("completed");
                return data;
            }
        });
        Thread thread = new Thread(future);
        thread.start();
        return future;
    }
Callable這個類別基本上跟Runnable很像, 都是可以丟進Thread內執行的,
唯一的差別是他會回傳出資料。
FutureTask就不陌生了, Future Pattern就說明了他的原理。
將主要任務放在call裡面, 接著將FutureTask物件直接丟給Thred執行即可,
當執行完畢就把FutureTask物件回傳出去。
        public static void main(String[] args) {
                Main m = new Main();
                FutureTask<Data> futureTask = m.setup();
                try {
                        while(!futureTask.isDone());
                        System.out.println(futureTask.get().getData());
                } catch (InterruptedException e) {
                        e.printStackTrace();
                } catch (ExecutionException e) {
                        e.printStackTrace();
                }
        }
在主程式內不斷的去確認FutureTask是否完成, 如果完成就可以印出completed字串。
結果
10%
20%
30%
40%
50%
60%
70%
80%
90%
100%
completed
github