gpt4 book ai didi

java - java中通过传递参数实现多线程

转载 作者:行者123 更新时间:2023-11-30 04:51:59 25 4
gpt4 key购买 nike

我正在从数据库中以 240 大小的 ArrayList 形式检索一些值,并从每个包含 8 个值的列表中创建一个子列表。我想对此子列表进行一些处理,该子列表将作为参数传递给线程。我正在 for 循环中创建线程对象,在该循环中创建该子列表并将其传递给线程。但我面临的问题是我必须等到一个线程完成其工作,因为该参数在线程中是全局的并给出并发错误。我如何才能不将其设为全局变量并在不等待 1 个线程完成的情况下对我的子列表进行处理,我想发送并行请求并处理此子列表。请查看我正在编写的一些代码:

Class a {

for(int j=0; j<240; j++) {

subOrders.add(orders.get(j));
if(subOrders.size()==8)
{
TestThread test = new TestThread(subOrders);
try {
test.t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
subOrders.clear();
}

}
}

线程类:

public class TestThread implements Runnable {

ArrayList<Integer> b ;
public Thread t;
public TestThread(ArrayList<Integer> a) {
b=a;
t= new Thread(this);
t.start();
}


@Override
public void run() {
ArrayList<Integer> c = b;

System.out.println(c);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}




}

最佳答案

这是将数据传递到线程的正常方式。请注意,此方法要求将变量声明为final。如果您不需要更改子列表,则获取子列表的第一种方法就很好。第二个可以修改,无需担心同步问题(任何修改都不会反射(reflect)在全局订单列表中)。

for (int i = 0; i < 240; i+=8) {
// this sub list is backed by the orders list, so you should be careful
// if you need to alter the sub list.
final List<Integer> subList = orders.subList(i, i+8);
final List<Integer> subListThatAllowsLocalModifications =
new ArrayList<Integer>(subList);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(subList);
}
});
t.start();
}

关于java - java中通过传递参数实现多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com