0

この方法で実装したい Java のスレッドのグループがいくつかあるとしましょう。各時点で実行できるスレッドのグループは 1 つだけで、他のグループはその順番 (周期的) を待つ必要があります。

どのようにそうすることをお勧めしますか?

4

1 に答える 1

0

a を使用しCyclicBarrierて、スレッドの 1 つのグループが実行されている間、他のグループがまだ進行中であることを防ぐことができます。を使用して次のグループを解放できます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();
于 2014-12-23T02:55:12.457 に答える