2013-04-08 101 views
1

我有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

回答

1

您需要使用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