程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java多線程之FutureTask類使用教程

java多線程之FutureTask類使用教程

編輯:關於JAVA
 

本章來介紹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方法的時候,如果我們的計算還沒結束會阻塞到任務計算完成為止,如果計算已經完畢就會立即返回,這樣可以提高我們的用戶體驗.

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved