1

我有 4-5 个工作线程处理大型消息队列。而且我还有另一段代码使用 2-3 个工人运行。我想在处理大型消息队列时阻止所有其他工作人员。

我正在使用 JDK 6 和 Jms

编辑:

队列进程工作者从未终止。当没有消息时,他们阻塞在队列中。这些工人由执行线程池管理。如果我使用读写锁,这些工人之一也会被阻塞。此外,如果使用循环屏障,那么我必须终止线程以释放阻塞的第二个进程。由于工作人员由线程池管理,因此不能保证所有工作人员都会忙于处理消息。

让我知道,

final ExecutorService executor = getExecutorManager().getExecutor();
for (int i = 0; i < threadPoolSize; i++) {
executor.submit(new MessageWorker(qConn));
}

以下是第二个模块,我希望在队列处理器工作线程工作时阻止所有工作人员。

final ExecutorService executor = getExecutorManager().getExecutor();
for (int i = 0; i < threadPoolSize; i++) {
executor.submit(new DbUpdateWorker());
}
4

1 回答 1

1

您需要使用CyclicBarrier

一种同步辅助工具,它允许一组线程相互等待以达到共同的障碍点。CyclicBarriers 在涉及固定大小的线程组的程序中很有用,这些线程组必须偶尔相互等待。屏障被称为循环的,因为它可以在等待线程被释放后重新使用。

用于:

CyclicBarrier barrier = new CyclicBarrier(numWorkers, runnable);

当您的工作线程完成时,您想要调用runnable的 a在哪里。Runnable每个线程在完成时调用barrier.await()

于 2013-04-08T18:49:18.660 回答