-1

方案 - 隊列具有消息對象。輪詢隊列並將消息傳遞給消息處理程序。消息檢索(poll)應該在客戶端登錄事件(一個或多個)上停止。我可以使用等待/通知機制來實現此目的,但Joshua Bloch的建議說,幾乎沒有任何理由在併發實用程序出現時使用繁瑣的等待/通知機制。我無法選擇哪個同步器(信號量,循環屏障,倒數計時器)適合我的目的。任何意見讚賞。Java同步器

+3

這確實需要代碼。什麼樣的隊列?例如,你可能指的是[JMS消息隊列](http://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html),但我認爲你不是。 – markspace 2014-11-03 17:51:30

+0

@markspace消息從JMS隊列中提取,然後放入LinkedList(用於異步處理)。目前,我提到的隊列是LinkedList。 – 2014-11-03 17:54:07

+0

JMS專爲異步消費而設計。你爲什麼不讓消息在JMS隊列中? – 2014-11-03 18:03:20

回答

1

如果不需要立即終止,可以使用「毒丸」模式。當用戶登錄時,在隊列上放置一個特殊的「終止」對象。當您輪詢隊列時,請檢查該特殊的唯一對象。例如

public static final Message POISON_PILL = new Message(); 

... 

in your loop { 
    Message message = queue.take(); 
    if (message == POISON_PILL) // note usage of == here! 
     stopTheQueue(); 
    else 
     normalProcessing(message); 
} 

這意味着隊列將處理用戶登錄前存在的所有消息。這可能是您想要的。

如果停工需要爲立即,請檢查Thread.interrupted()As described here。這要求登錄處理程序知道哪個線程正在處理隊列,從而增加了耦合。所以「毒丸」很好,因爲它有較少的耦合。