簡體   English   中英

如何在java中為列表中的項目創建多個線程?

[英]How to create multiple threads in java for items in a list?

我有一個訂單清單:

命令

  • 數字
  • 細節

列出訂單

我需要創建一個多線程數組(限制 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 會增加,但它不會傳遞給線程,並且每個線程將處理相同的順序。

我怎樣才能為每個線程傳遞一個訂單號(不同的)來處理?

這是因為您在 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必須在循環中聲明,而不是在外部聲明,因為這將使其成為有效的最終變量。 這是因為該變量在每次迭代時都會使用一個在其存在期間不會改變的常量值重新創建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM