2014-12-22 3 views
0

Допустим, у меня есть несколько групп потоков в java, которые я хочу реализовать таким образом: в каждый момент времени может выполняться только одна группа потоков, а остальные должны ждать своей очереди (циклический).Запуск групп нитей

Как вы рекомендуете это делать?

ответ

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(); 
Смежные вопросы