我有一個非常簡單的 java 代碼片段:
ExecutorService executor = null;
try {
executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i ) {
executor.submit( () -> processRule(rule_queue.poll()));
}
}
事情是這樣的:如果我用 rule_queue.size() 替換 10(在我的情況下是 rule_queue 佇列中的物件數),那么并非所有任務都會被執行。
這是一個非常奇怪的行為,對于 1-2 個 fixedThreadPool 執行緒它會起作用,但對于 3 個及以上的固定執行緒,通常只會執行 5-7 個任務。
問題是佇列中的物件數來自資料庫,因此我無法將其硬編碼到 for 回圈中。
方法 processRule 做了一些資料庫插入/選擇,所以我也不想打開太多執行緒/連接,同時 4-5 個 SQL 選擇就足夠了。
預先感謝任何幫助如何運行所有任務以及如何并行運行 4 個并將所有其他任務(最多 300 個)放入 executors 佇列。
編輯:抱歉忘了在這段代碼之后寫下另外兩行是 executor.shutdown() 并等待完成。
uj5u.com熱心網友回復:
我假設你更換了
for (int i = 0; i < 10; i ) {
executor.submit( () -> processRule(rule_queue.poll()));
}
和
for (int i = 0; i < rule_queue.size(); i ) {
// ^^^^^^^^^^^^^^^^^
executor.submit( () -> processRule(rule_queue.poll()));
}
問題是rule_queue.size()每次迭代都會重新評估。考慮初始佇列大小為 2 的情況。
Iteration i rule_queue.size() result
--------- - ----------------- ------
1 0 2 submit
2 1 1 exit loop
所以只有一半的規則會被提交。你想要的是:
while(rule_queue.size() > 0) {
executor.submit( () -> processRule(rule_queue.poll()));
}
如果您在 IDE 除錯器中單步執行了代碼,您會立即看到這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/461341.html
下一篇:沒有二進制信號量會發生什么
