本章來介紹jdk5.0中一種有用的同步工具類FutureTask,我們可以用FutureTask來實現某種比較耗時的計算,當調用get時如果任務計算完成就會立即返回結果,否則get將阻塞直到任務完成狀態。下面看我寫的一個例子,通過FutureTask提前啟動計算,可以來減少需要等待的時間.
package com.thred;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTest {
public static void main(String[] args) {
Preloader preloader = new Preloader();
preloader.start();
List<String> datas = null;
datas = preloader.getDatas();
for (String str : datas) {
System.out.println(str);
}
}
}
class Preloader {
private Callable<List<String>> callable = new Callable<List<String>>() {
@Override
public List<String> call() throws Exception {
return downloadData();
}
};
private Thread thread;
private FutureTask<List<String>> future;
private List<String> downloadData() {
List<String> list = new ArrayList<String>();
// 模擬下載數據
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10; i++) {
list.add("data" + i);
}
return list;
}
private void init() {
future = new FutureTask<List<String>>(callable);
thread = new Thread(future);
}
public Preloader() {
init();
}
public void start() {
thread.start();
}
public List<String> getDatas() {
try {
return future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return null;
}
}
通過上面的例子,我們可以知道FutureTask非常適合那種比較耗時的計算並且可以提前啟動的場景,例如我們在開發安卓程序的時候,在打開一個Activity的時候,可以用FutureTask提前啟動去獲取比較耗時的資源,當調用get方法的時候,如果我們的計算還沒結束會阻塞到任務計算完成為止,如果計算已經完畢就會立即返回,這樣可以提高我們的用戶體驗.