我們在處理多線程任務時希望在任務被取消或者正常完成後做一些後期處理,例如釋放系統資源,更新數據庫狀態等等。java多線程技術中為我們提供了這樣一個類叫FutureTask,他可以幫助我們實現任務在done狀態後可以做一些後期處理。
FutureTask 使用
public class FutureTaskDemo {
// 異步任務
static class Task implements Callable
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName());
return 100;
}
}
public static void main(String[] args) {
Task task = new Task();
//使用FutureTask
FutureTask
// 創建線程池
ExecutorService executor = Executors.newCachedThreadPool();
//異步執行任務
executor.execute(futureTask);
//使用Future
Future
try {
// 阻塞,等待異步任務執行完畢,獲取異步任務的返回值
System.out.println("FutureTask result:" + futureTask.get());
System.out.println("Future result:" + future.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}
FutureTask使用場景
FutureTask可以用來異步獲取處理結果,創建一個FutureTask來處理運算,在主線程的合適位置調用get獲取處理結果,去除主線程的等待時間,將等待時間可以去處理其他複雜的業務邏輯。
還有在很多高併發的環境下,往往我們只需要某些任務只執行一次。這種使用情景FutureTask的特性恰能勝任。舉一個例子,假設有一個帶key的連接池,當key存在時,即直接返回key對應的對象;當key不存在時,則創建連接。
尚學堂立志解決中國教育不公平和低效率問題,幫助千千萬萬被傳統教育方式耽誤的人,傳授實用、前沿的知識,成就學員個人理想,為愛你的人和你愛的人創造美好的生活。尚學堂12大精英團隊+各類實戰項目,真正實現1+1>10的目標效果。幫助學員迅速成長,持久騰飛,成就學員“高富帥”人生。
閱讀更多 小菜鳥學Java 的文章