Multitheading阻塞工作线程

问题描述:

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

我使用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()); 
} 
+0

在这种情况下,您可以使用'ReadWriteLock'。让所有小型消息处理器锁定读取锁定和大型消息队列处理器锁定以进行写入。虽然不太合适。 – Gray 2013-04-08 19:26:06

您需要使用CyclicBarrier

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

用途为:

CyclicBarrier barrier = new CyclicBarrier(numWorkers, runnable); 

哪里runnable是要当你的工作线程完成后调用Runnable。完成后,每个线程都会调用barrier.await()

+0

这并不能解决我的问题,请查看编辑部分 – gpa 2013-04-09 18:21:13

+0

@apg,你几乎肯定在这里有一个糟糕的设计。实际上不应该有长时间运行的工作线程;使用线程池。 – djechlin 2013-04-09 21:38:31

+0

我正在使用如上所示的线程池。线程正在锁定jms队列。 – gpa 2013-04-10 14:07:25