當向執行緒池提交callable任務後,我們可能需要一次性獲取所有返回結果,有三種處理方法。
// 建立乙個執行緒池
executorservice executorservice = executors.newfixedthreadpool(10);
// 儲存執行結果的list
list> results = new arraylist>();
// 提交10個任務
for ( int i=0; i<10; i++ )
} );
// 將執行結果存入results中
results.add( result );
}// 獲取10個任務的返回結果
for ( int i=0; i<10; i++ )
此方法的弊端:
需要自己建立容器維護所有的返回結果,比較麻煩;
從list中遍歷的每個future物件並不一定處於完成狀態,這時呼叫get()方法就會被阻塞住,如果系統是設計成每個執行緒完成後就能根據其結果繼續做後面的事,這樣對於處於list後面的但是先完成的執行緒就會增加了額外的等待時間。
本方法能解決第乙個弊端,即並不需要自己去維護乙個儲存返回結果的容器。當我們需要獲取執行緒池所有的返回結果時,只需呼叫invokeall函式即可。
但是,這種方式需要你自己去維護乙個用於儲存任務的容器。
// 建立乙個執行緒池
executorservice executorservice = executors.newfixedthreadpool(10);
// 建立儲存任務的容器
list> tasks = new arraylist>();
// 提交10個任務
for ( int i=0; i<10; i++ )
};executorservice.submit( task );
// 將task新增進任務佇列
tasks.add( task );
}// 獲取10個任務的返回結果
list> results = executorservice.invokeall( tasks );
// 輸出結果
for ( int i=0; i<10; i++ )
completionservice內部維護了乙個阻塞佇列,只有執行完成的任務結果才會被放入該佇列,這樣就確保執行時間較短的任務率先被存入阻塞佇列中。
executorservice exec = executors.newfixedthreadpool(10);
final blockingqueue> queue = new linkedblockingdeque>(
10);
//例項化completionservice
final completionservicecompletionservice = new executorcompletionservice(
exec, queue);
// 提交10個任務
for ( int i=0; i<10; i++ )
} );
}// 輸出結果
for ( int i=0; i<10; i++ )
Springboot 多執行緒 等待獲取執行結果
在日常的開發專案過程中,時常會有多執行緒的使用場景。最近開發的需求中也是如此,只不過這次需要開啟多執行緒去執行,最後要等所有執行緒結束統一獲取結果。所以在此整理一下 在springboot專案中開啟非同步執行緒需要滿足一下幾點 因為需要開啟多執行緒非同步執行並獲取其返回結果,所以選用future作為...
python多執行緒非同步執行,並獲取每個執行緒的結果
需求 多工非同步執行,每個任務返回不一樣的結果,等到所有任務結束,獲取到每個任務的結果之後,主程式再結束。1 coding utf 8 2import threading 3import time 4import traceback56 7class mythread threading.threa...
批量VS多執行緒
在實際的編碼過程中,總會遇到單一處理會有效能風險的問題,於是我們求助於批量或者多執行緒。一 批量處理 一般情況下批量處理就可以規避大部分效能風險的問題。將fetch 改為batchfetch 多數情況都比較簡單,尤其是呼叫其他應用的介面時,將單一介面,換成批量介面即可 而最終主要是修改資料從資料庫中...