【发布时间】:2015-01-21 14:07:16
【问题描述】:
我有一个接受客户端连接的服务器程序。这些客户端连接可以属于许多流。例如,两个或多个客户端可以属于同一个流。在这些流中,我必须传递一条消息,但我必须等到所有流都建立起来。为此,我维护了以下数据结构。
ConcurrentHashMap<Integer, AtomicLong> conhasmap = new ConcurrentHashMap<Integer, AtomicLong>();
Integer 是流 ID,Long 是客户端编号。为了使给定流的一个线程等待 AtomicLong 达到特定值,我使用了以下循环。实际上,流的第一个数据包将其放入流 ID 和要等待的连接数。对于每个连接,我都会减少等待的连接数。
while(conhasmap.get(conectionID) != new AtomicLong(0)){
// Do nothing
}
但是这个循环阻塞了其他线程。根据这个 answer 它进行易失性读取。如何修改代码以等待给定流的正确线程,直到它达到特定值?
【问题讨论】:
-
为什么不使用 thread.wait() 并在服务器接受新连接后唤醒它?另一个不太优雅的解决方案是睡一会儿并检查值。
-
使用
Condition可能吗? -
@PbxMan 我正在等待服务器已经接受的线程。是的,睡一会儿并读取值可能会起作用,但是我正在寻找更好的方法。
-
只是一个想法:我不能等待 AtomicLong 值并在线程等待线程然后值达到零时通知吗?
-
@fge 将检查条件
标签: java multithreading concurrency java.util.concurrent concurrenthashmap