2013-02-12 3 views
0

소프트는 일부 계산을 수행해야합니다 : 총 62500 개의 루프와 하나의 루프 지속 시간은 0.5 초입니다. 그것은 ~ 8 ​​시간의 일 (for for for for)입니다. 나는 100 개의 개별 스레드로 나눠야하며 작업 시간은 8 분으로 단축됩니다. CPU가 62500 스레드를 열 수 없기 때문에 100 개 스레드를 다시 열 수있는 솔루션을 찾아야합니다. CountDownLatch를 사용해 보았지만 사이클을 재설정 할 수 없기 때문에 CyclicBarrier가됩니다.Java : 순환 복소수가 작동하지 않습니다.

private CycleBarrier cb; 

// this Overrided run is called only once from the view to not block the UI. 
@Override 
public void run(){ 

    // count is the number of the actions that i want to do 
    // this is why I'm using CycleBarrier 
    for(int count = 0; count < 2; count++){ 
     System.out.println("MAIN THREAD: #"+count); 

     int x1 = 0; 
     cb = new CycleBarrier(100, new Runnable(){ 
     @Override 
     public void run(){ 
      // HOW TO STOP CYCLE ??? 
     } 
     }); 

     for(int i = 0; i < 100; i++){ 
     new Thread(new Test(x1, cb)).start(); 
     x1 += 25; 
     } 
    } 
} 

그리고주기가 작동하지 테스트 클래스

public class Test implements Runnable{ 

    int x1; 
    CycleBarrier cb; 

    public Test(int _x1, CycleBarrier _cb){ 
     x1 = _x1; 
     cb = _cb; 
    } 

    @Override 
    public void run(){ 
     // this for in for has 6250 loops 
     for(int i = x1; < x1+25; i++){ 
     for(int j = 0; j < 250; j++){ 
      System.out.println(" |--> LOOK I'm WORKING: "+i+" "+j); 
     } 
     } 

     // After the job is done, it should be put in to await 
     cb.await(); 
    } 
} 

. 한 번에 200 번을 열어. 내가 디버그 (일식)했는데 왜 스레드가 하나에서 다른 점프, 나는 결과를 따라갈 수 없는지 모르겠다. 코드에서

MAIN THREAD: #0 
    LOOK I'm WORKING: 0 0 
    LOOK I'm WORKING: 0 1 
    ... 
    LOOK I'm WORKING: 25 254 
    LOOK I'm WORKING: 25 255 

MAIN THREAD: #1 
    LOOK I'm WORKING: 0 0 
    LOOK I'm WORKING: 0 1 
    ... 
    LOOK I'm WORKING: 25 254 
    LOOK I'm WORKING: 25 255 
+0

무엇이 당신의 질문입니까? –

+0

왜 100 대신 한 번에 200 스레드를 여는거야? –

답변

0
cb = new CycleBarrier(100, new Runnable(){ 
@Override 
public void run(){ 
     // HOW TO STOP CYCLE ??? 
    } 
    }); 

    for(int i = 0; i < 100; i++){ 
    new Thread(new Test(x1, cb)).start(); 
    x1 += 25; 
    } 

이 새의 Runnable 내부 새로운 Thread 객체를 열고 있습니다 : 같은

콘솔이 보일 것입니다. 따라서 두 개의 스레드가 있습니다.