繁体   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