1

我有一个客户端(比如客户)向服务器端发送请求(RequestID 为 1)并接收已发送请求的确认。我的服务器端(比如 SomeStore)处理请求 1 并发送给客户并接收确认(或重新发送 3 次)。我有另一个线程在听客户。收到客户的侦听器线程后,应在键 1 处更新 HashMap。我所需要的只是等待并在键 1 处检索此更新后的值。

我有一个来自线程池的线程来发送请求并在两端接收确认。我看到两个线程都执行发送过程。我还有一个用于监听器的线程池。收到 ack 后,如果我让我的主线程在 while 循环中等待,我看不到侦听器的更新。(在这里我无法使用 wait())。我不明白这种行为。两个线程不应该工作吗?

我尝试更改我的实现并在接收并与 myHashMap.get(key) 上的 this.wait() 和 myHashMap.set(key, value) 上的 this.notify() 同步时创建了一个单独的类。它工作了几次,但并非总是如此。我的理解是,这取决于哪个线程首先获得锁。

我怎么能同时等待和倾听?也许我正在监督一些明显的事情......很容易收到回复而不是确认,但我的请求在网络中丢失了。因此使用 ack。我已经在使用 Callable<> 进行确认。任何想法表示赞赏...

4

1 回答 1

1

我怀疑您没有使用线程安全访问地图。

如果它不是 ConcurrentHashMap 并且您没有使用同步,则无法保证您将看到 HashMap 中的更改。

我建议您不要使用等待/通知和您自己的线程,而是使用 ConcurrentHashMap 和ExecutorService并添加任务来执行更新。这将确保您处理并查看每个更新。

于 2012-12-05T15:45:17.280 回答