我有4-5个工作线程处理大型消息队列。而且我还有另一段使用2-3名工作人员的代码。我想在处理大型消息队列时阻止所有其他工作程序。
我正在使用JDK 6和Jms
编辑:
队列流程工作人员从未终止。没有消息时,他们在队列中阻塞。这些worker由执行程序线程池管理。如果我使用读写锁,其中一个工作程序也会被阻塞。 此外,如果使用循环屏障,那么我必须终止线程以重新阻塞第二个进程。由于工作人员是由线程池管理的,因此无法确保所有工作人员都忙于处理消息。
让我知道,
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());
}
答案 0 :(得分:1)
您需要使用CyclicBarrier。
一种同步辅助工具,允许一组线程全部等待彼此到达公共障碍点。 CyclicBarriers在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。屏障称为循环,因为它可以在等待线程释放后重新使用。
用作:
CyclicBarrier barrier = new CyclicBarrier(numWorkers, runnable);
当您的工作线程完成时,runnable
是您要调用的Runnable
。每个线程在完成后调用barrier.await()
。