运行线程组

时间:2014-12-22 17:08:23

标签: multithreading concurrency cyclicbarrier

假设我在java中有几组线程,我想以这种方式实现:在每个时间点,只有一组线程可以运行,其他线程应该等待轮到他们(循环)。

你会如何建议这样做?

1 个答案:

答案 0 :(得分:0)

您可以使用CyclicBarrier来防止一组线程在另一组仍在进行时运行。您可以使用CountDownLatch发布下一个组。

您要做的是在继续之前等待当前组之前重置循环屏障。在所有线程countdown the latch之后,屏障将被重置。

例如:

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();