2012-03-10 4 views
1

DB에서 240 크기의 ArrayList 형식으로 일부 값을 검색하고 각 8 개의 값 목록에서 하위 목록을 만듭니다. 스레드로 매개 변수로 전달되는이 하위 목록에서 일부 처리를 수행하고 싶습니다. 이 하위 목록이 만들어지고 스레드로 전달되는 for 루프에서 스레드 개체를 만듭니다. 하지만 하나의 스레드가 작업을 마칠 때까지 기다려야하는 문제에 직면하고 있습니다. 매개 변수가 스레드에서 전역이고 동시성 오류가 발생하기 때문입니다. 어떻게 전역 변수로 만들 수 없으며 하나의 스레드가 끝나기를 기다리지 않고 하위 목록에서 처리를 수행 할 수 있습니다. 병렬 요청을 보내고이 하위 목록을 처리하려고합니다.자바에서 매개 변수를 전달하여 멀티 스레딩

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

올바른 코드 형식으로 게시물을 수정하십시오. –

+0

왜 하위 목록이 전역인지 여부를 신경 써야합니까? 확실히 그렇지 않다면 더 좋을 것입니다. – Dunes

답변

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

감사합니다. –

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

시간 내 주셔서 감사합니다. 내 문제가 해결되었습니다 :) –