2014-12-22 8 views
0

내가 이런 방식으로 구현하고자하는 자바 스레드 그룹이 몇 개 있다고 가정 해 보겠습니다. 각 시점에서 스레드 그룹 하나만 실행할 수 있고 나머지는 차례를 기다려야합니다 (사이 클릭).스레드 그룹 실행

추천하는 방법은 무엇입니까?

답변

0

CyclicBarrier을 사용하면 다른 그룹이 계속 진행되는 동안 한 스레드 그룹이 실행되지 않도록 할 수 있습니다. CountDownLatch을 사용하여 다음 그룹을 출시 할 수 있습니다.

계속하기 전에 전류가 순환 장벽을 재설정하기 전에 그룹을 기다리는 것이 좋습니다. 장벽이 모든 스레드 카운트 래치 후 재설정됩니다. 예를 들어

:

CyclicBarrier nextGroupContinue = new CyclicBarrier(1); 
ExecutorService service = Executors.newCachedThreadPool(); 
final Runnable[][] groups = // init 

try { 
    for (Runnable[] group : groups) { 
     int threads = group.length; 
     final CountDownLatch reset = new CountDownLatch(threads); 

     nextGroupContinue.await(); 
     for (final Runnable runnable : group) { 
      service.execute(new Runnable() { 
       @Override 
       public void run() { 
        runnable.run(); 
        reset.countDown(); 
       } 
      }); 
     } 

     reset.await(); 
     nextGroupContinue.reset(); 
    } 
} catch (InterruptedException | BrokenBarrierException e) { 
    e.printStackTrace(); 
} 

service.shutdownNow();