Givemepass's Android 惡補筆記

如何使用Future Pattern

| Comments

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

Comments

comments powered by Disqus