2012-03-10 43 views
1

我正在從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

回答

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

謝謝,這工作:) – 2012-03-11 15:11:42

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); 
    } 
} 
+0

感謝您的時間,我的問題得到解決:) – 2012-03-11 15:12:31