通过在java中传递参数进行多线程处理

问题描述:

我正在从ArrayList的240大小的表单中检索一些值,并从每个值的列表中创建一个子列表。我想在这个子列表上做一些处理,它将作为参数传递给线程。 我正在创建线程对象的for循环中创建该子列表并将其传递给线程。但是我面临的问题是我必须等到一个线程完成其工作,因为参数在线程中是全局的并且会给出并发性错误。 如何不让它成为一个全局变量并且在我的子列表上进行处理而不等待1个线程完成,我想发送并行请求并处理这个子列表。 请看到一些代码,我正在写:通过在java中传递参数进行多线程处理

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(); 
     } 

    } 
} 

Thread类:

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

请使用正确的代码格式编辑您的文章。 – 2012-03-10 23:16:28

+0

为什么你在乎子列表是否全局?如果不是,那肯定会更好。 – Dunes 2012-03-10 23:19:01

这是您将数据传递给线程的正常方式。请注意,此方法要求将该变量声明为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(); 
} 
+0

谢谢,这工作:) – 2012-03-11 15:11:42

您需要创建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); 
    } 
} 
+0

感谢您的时间,我的问题得到解决:) – 2012-03-11 15:12:31