我正在从DB大小为240的大小的形式中从DB中检索一些值,并从每个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();
}
}
答案 0 :(得分:1)
您需要创建8个元素列表的单独实例。在您发布的代码中,所有线程都将具有相同元素的列表,最后8个元素。 试试这个:
subOrders = new ArrayList<Integer>(8);
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) {
e.printStackTrace();
}
subOrders = new ArrayList<Integer>(8);
}
}
答案 1 :(得分:1)
这是将数据传递给线程的常规方法。请注意,此方法要求将变量声明为final。如果您不需要更改子列表,则获取子列表的第一种方法很好。第二个可以修改而不必担心同步问题(任何修改都不会反映在全局订单列表中)。
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();
}