0

除了wait/notify還有一種更簡潔的線程間事件通知方式嗎?
例如如果我想要Thread X通知ThreadY發生了什麼事情,在併發包中有比在wait/notify之上構建更好的構造嗎?
我的要求很簡單: ThreadB預計會發生一個事件。 ThreadA負責檢測這些變化。當變化發生ThreadA運籌學ThreadB協調線程無需等待/如果可能通知

更新:
我需要做的觀察者/可觀察的模式,但我想觀察的到,當它在環通知觀察員阻止儘可能少。
I.e.觀察者將是單獨的線程,並且火災變化的觀察值將「通知」它們以便儘可能少地阻止

+1

您能否提供更多關於您的要求的細節?你在'java.util.concurrent'中看到了什麼(例如'CyclicBarrier','CountdownLatch'?你需要傳遞信息,還是僅僅通知本身? – 2013-02-26 13:25:48

+0

更好的方式是什麼?java有信號量,IIRC。 – 2013-02-26 13:25:49

+0

@JonSkeet:請參閱更新。你提到的結構是關於開始線程一起等對嗎? – Jim 2013-02-26 13:28:50

回答

0

不幸的是,您的要求仍然很模糊。有三個主要的併發原語可用於在較高級別進行通知,然後等待/通知等待/信號。

您可以有一個等待線程完成的屏障,一個等待來自另一個線程的消息的屏障,或者您可以有一個屏障來等待事件上的多個線程。

您可以使用CyclicBarrierCountdownLatchPhaser

對於第二個,您可以使用任何BlockingQueue,無論是LinkedBlockingQueue,ArrayBlockingQueueSynchronousQueueTransferQueue

最後,您可以使用ExecutorService + Future

下一個問題:

什麼是一個事件,什麼在改變?這一點很重要,如果一個字段被改變,你可以用SettableFuture

編輯備份你的領域/事件更新:

可以包含一個新庫。看起來Akka會很好地爲你工作。

+0

您寫的第二個:「等待來自另一個線程的消息的障礙」似乎正是我需要的。但是如何使用隊列?我不知道這裏不需要排隊。另外我不確定還有什麼要寫的更清楚 – Jim 2013-02-26 13:43:52

+0

當你說'更新通知'時,請參閱更新 – Jim 2013-02-26 13:51:49

+0

@Jim通知的線程是否需要更新線程的結果,還是隻是需要通知它可以啓動一些東西。 – 2013-02-26 14:52:31

0

不要用等待/通知來寫入。 使用java.concurrent utils。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/package-summary.html

作爲例子,如果未綁定的隊列是適合你的需求,那麼使用的ConcurrentLinkedQueue: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html

BTW最好的辦法是避免手動在所有使用期貨和演員,而不是線程的管理。

+0

ConcurrentLinkedQueue實際上並不是最好的使用隊列,它是線程安全的,但沒有等待語義 – 2013-02-26 13:35:54

+0

但是我不需要隊列。只需一個通知機制 – Jim 2013-02-26 13:37:39

0

您可以使用ExecutorService。它從Executor擴展而來,它提供了管理終止方法和方法,可以生成Future以跟蹤一個或多個異步任務的進度。在您描述的情況下使用它非常簡單Inter Thread Communication

+0

執行器不是h elpful here.I更新了OP – Jim 2013-02-26 13:38:09

+0

@Jim如果我找到了你正確的你正在談論這個設計http://en.wikipedia.org/wiki/Observer_pattern – 2013-02-26 13:43:50

+0

這是正確的。但我需要通知在一個單獨的線程完成以便可觀察性不被阻止。只需通知並返回 – Jim 2013-02-26 13:47:41

0

java.util.concurrent。鎖包類鎖,條件和其他更多的控制線程協調。

0

如果你不想阻止你的觀察者(因爲他們忙於其他任務),那麼你需要實現某種輪詢機制。你不能在另一個未被阻塞的線程中神奇地調用一個方法,因爲另一個線程有自己的時序邏輯。

最簡單的輪詢解決方案將設置一個易失性變量爲特殊值,並定期檢查觀察者線程中的變量。

0

如果您不想引入任何複雜的數據結構並只通知線程,那麼您還可以查看中斷線程。消費者線程並在循環中運行,並在中斷時執行處理,然後再次退出/在循環中運行。