我有一个客户端(比如Customer)将请求(带有RequestID 1)发送到服务器端并接收发送请求的确认。我的服务器端(比如SomeStore)处理请求1并发送给客户并接收确认(或重新发送三次)。我有另一个线程在听客户。在收到客户的监听器线程后,应该在密钥1处更新HashMap。我只需要等待并在密钥1处检索此更新的值。
我有一个来自线程池的线程来发送请求并在两端收到确认。我看到两个线程都在执行发送过程。我还有一个用于监听器的线程池。收到ack后,如果我让我的主线程在while循环中等待,我看不到监听器的更新。 (这里我不能用wait())。我不明白这种行为。这两个线程不应该工作吗?
我尝试更改我的实现并在接收到myHashMap.get(key)上的this.wait()和myHashMap.set(key,value)上的this.notify()时创建了一个单独的类。它工作了几次而且并非总是如此。我的理解是它取决于哪个线程首先得到锁。
我还能在何时等待和聆听?也许我正在监督明显的事情...... 很容易收到回复而不是ack,但我的请求在网络中丢失。因此使用ack。我已经在使用Callable<>对于ack。任何想法都表示赞赏......
答案 0 :(得分:1)
我怀疑您没有使用线程安全访问地图。
如果它不是ConcurrentHashMap并且您没有使用同步,那么您将看不到HashMap中的更改。
我建议您使用ConcurrentHashMap和ExecutorService并添加任务来执行更新,而不是使用wait / notify和您自己的线程。这将确保您处理并查看每次更新。