我有一個訂單清單:
命令
- 數字
- 細節
列出訂單
我需要創建一個多執行緒陣列(限制 8 個執行緒,以免 cpu 過載),并為每個執行緒分配串列中的一個專案。
目前我正在做以下事情:
int limit = 8;
int size = orders.size();
j=0;
if(size <= 8) {
limit = size;
}
for(; j < size; j = 8) {
Thread[] threads = new Thread[limit];
for (; index < threads.length; index ) {
threads[index] = new Thread(() -> {
treatOrder(orders.get(j).getNUMBER());
});
j ;
threads[index].start();
}
for (Thread thread : threads) {
thread.join();
}
}
問題是,如果我這樣做, j 會增加,但它不會傳遞給執行緒,并且每個執行緒將處理相同的順序。
我怎樣才能為每個執行緒傳遞一個訂單號(不同的)來處理?
uj5u.com熱心網友回復:
這是因為您在 lambda 中使用了非最終變數或非有效最終變數。Lambda 運算式是詞法范圍的,這意味著它們不會引入新級別的范圍,并且為了讓它們使用外部宣告的變數,它們必須是 final 或有效 final,因為一旦 lambda 運算式是 Java 就會創建這些變數的副本執行。
您可以通過在包含訂單號的回圈中宣告一個臨時變數來修復您的代碼:
int limit = 8;
int size = orders.size();
int j = 0;
if (size <= 8) {
limit = size;
}
for (; j < size; j = 8) {
Thread[] threads = new Thread[limit];
for (; index < threads.length; index ) {
String orderNumber = orders.get(j).getNUMBER();
threads[index] = new Thread(() -> {
treatOrder(orderNumber);
});
j ;
threads[index].start();
}
for (Thread thread : threads) {
thread.join();
}
}
注意: temp var必須在回圈內宣告,而不是在外部宣告,因為這將使其成為有效的最終變數。這是因為該變數在每次迭代時都會重新創建一個常量值,該常量值在其存在期間不會改變。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485011.html
