我正在从数据库中以 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/