2014-06-09 5 views
0

아래 코드는 병렬로 실행되는 것처럼 보이지 않지만 각 스레드마다 await() 메소드를 호출 한 후에 하나의 요청을 발행 한 것처럼 보입니다. 누군가이 스레드를 병렬로 호출하는 것을 도울 수 있습니까?다른 로직을 수행하는 병렬 스레드의 순환 바리어

public class XYZ { 

    private static String baseUrl = "http://xyz.polls.com"; 

    public static void main(String[] args) { 
    MultiThreadedHttpConnectionManager conMgr =new MultiThreadedHttpConnectionManager(); 

    HostConfiguration hostConf = new HostConfiguration(); 
    hostConf.setHost("xyz.polls.com"); 

    HttpConnectionManagerParams connParam = new HttpConnectionManagerParams(); 
    connParam.setMaxConnectionsPerHost(hostConf, 5); 
    connParam.setMaxTotalConnections(5); 
    conMgr.setParams(connParam); 

    HttpClient client = new HttpClient(conMgr); 
    client.setHostConfiguration(hostConf); 


    CyclicBarrier cyclicBarrier = new CyclicBarrier(1, new Runnable() { 
     private int count = 1; 

     public void run() { 
      System.out.printf("Cyclic Barrier Finished %d\n", count++); 
     } 
    }); 
    System.out.println("Spawning Threads"); 
    for(int i = 0; i < 1; i++){ 
     Thread t1 = new Thread(new UpdateProfile(cyclicBarrier, client)); 
     t1.start(); 

     Thread t2 = new Thread(new UpdateAccount(cyclicBarrier, client)); 
     t2.start(); 
    } 

    System.out.println("Spawning Finished"); 

    } 

private static class UpdateAccountThread implements Runnable{ 

    private CyclicBarrier cyclicBarrier; 
    private HttpClient httpClient; 

    public UpdateAccountThread(CyclicBarrier cyclicBarrier, HttpClient httpClient){ 
     this.cyclicBarrier = cyclicBarrier; 
     this.httpClient = httpClient; 
    } 

     /* (non-Javadoc) 
     * @see java.lang.Runnable#run() 
     */ 
     @Override 
     public void run() { 
     try{ 

      int count = cyclicBarrier.await(); 
      System.out.println("UpdateAccountThread : Cyclic Barrier count on " +count); 
      updateAccount(httpClient); 
     }catch (BrokenBarrierException e) { 
      e.printStackTrace(); 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     } 

    } 

    private static class UpdateProfileThread implements Runnable{ 
    private CyclicBarrier cyclicBarrier; 
    private HttpClient httpClient; 

    public UpdateProfileThread(CyclicBarrier cyclicBarrier, HttpClient httpClient){ 
     this.cyclicBarrier = cyclicBarrier; 
     this.httpClient = httpClient; 
    } 

    /* (non-Javadoc) 
    * @see java.lang.Runnable#run() 
    */ 
    @Override 
    public void run() { 
     try{ 
     int count = cyclicBarrier.await(); 
     System.out.println("UpdateProfileThread : Cyclic Barrier count on " +count); 
     updateProfile(httpClient); 
     }catch (BrokenBarrierException e) { 
     e.printStackTrace(); 
     } 
     catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 

    } 

    } 

private static void updateProfile(HttpClient client){ 
// logic here 
} 

private static void updateAccount(HttpClient client){ 
// logic here 
} 


} 

답변

2

당신은 당신의 단계에서 1 인으로 CyclicBarrier를 초기화됩니다 이 CyclicBarrier cyclicBarrier = new CyclicBarrier(1, new Runnable()....

당신은이 개 스레드에 도달 한 후 나누기 위해이 장벽을 기다립니다 그래서 2로 변경해야합니다.