我有一个java服务器应用程序通过套接字与客户端通信。每个客户端请求都在一个新线程中处理。但对于某些请求,我需要同步两个客户端。
示例:
我知道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中有可能是这样的吗?我的问题还有其他解决办法吗?
答案 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")
。