阻塞一个线程,直到它从某个其他线程获得特定信号(java)

时间:2013-07-22 19:27:25

标签: java multithreading synchronize

我有一个java服务器应用程序通过套接字与客户端通信。每个客户端请求都在一个新线程中处理。但对于某些请求,我需要同步两个客户端。

示例:

  • 客户端A向服务器S发送请求。
  • S上的线程S1接受A的请求。
  • S1通知客户B此请求(通过GoogleCloudMessaging)。
  • S1现在应该阻止
  • 客户B从S接收信息并向S发送请求。
  • S上的线程S2接受B的请求。
  • S1现在应该发布并从S2
  • 获取消息
  • S1将答案发送给客户A

我知道Lock Condition机制,但这在这里不起作用,因为我不知道创建线程时的条件。我需要这样的东西:

// 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中有可能是这样的吗?我的问题还有其他解决办法吗?

1 个答案:

答案 0 :(得分:0)

您的问题似乎是您没有可以调用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")