簡體   English   中英

阻塞線程,直到它從其他線程(java)獲得特定信號為止

[英]block a thread until it gets a specific signal from some other thread (java)

我有一個Java服務器應用程序通過套接字與客戶端通信。 每個客戶端請求都在一個新線程中處理。 但是對於某些請求,我需要同步兩個客戶端。

例:

  • 客戶端A向服務器S發送請求。
  • S上的線程S1接受A的請求。
  • S1通過GoogleCloudMessaging通知客戶端B此請求。
  • S1現在應該阻止
  • 客戶端B從S接收信息,並向S發送請求。
  • S上的線程S2接受B的請求。
  • 現在應該釋放S1並從S2獲取消息
  • S1將答案發送給客戶端A

我知道鎖定條件機制,但這在這里不起作用,因為我不知道創建線程時的條件。 我需要類似的東西:

// Pseudo Code
// on the S1 Thread, first argument beeing a signal ID, second a timeout
s1.waitForSignal("clientB", 10000);
// and on the S2 Thread to continue S1
SignalSender.send("clientB");

在Java中有可能發生這種情況嗎? 我的問題還有其他解決方案嗎?

您的問題似乎是您沒有可以在其上調用wait / notify的共享引用(更不用說可以使用的共享鎖定條件了)。

好吧,首先,這兩個線程之間已經共享了一些東西:即,在您的情況下,字符串"ClientB" 如果有這個功能,您要做的就是將該字符串映射到兩個類都可以訪問的地方的單個引用。

最簡單的實現是將靜態映射字段保存在某個地方,然后以某種方式用監視對象填充它:

public final class Monitors {

    private Monitors() {}

    private static final Map<String, Object> monitors = new HashMap<String, Object>();

    static { monitors.put("ClientB", new Object()); }

    public static Object get(String key) { return monitors.get(key); }

}

當然,您可能想編寫一個適當的服務來管理此映射,並可能在內部使用鎖和條件。 同樣,一個好主意是將等待和信令功能封裝在服務本身內,然后像下面那樣使用它: monitorService.waitForSignalsFrom("ClientB")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM