多线程阻塞工作线程

时间:2013-04-08 18:47:13

标签: java multithreading

我有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());
}

1 个答案:

答案 0 :(得分:1)

您需要使用CyclicBarrier

  

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

用作:

CyclicBarrier barrier = new CyclicBarrier(numWorkers, runnable);

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