我們實作了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