2013-10-18 33 views
1

我有一台服务器,它根据各个客户端的人工时间戳接收来自各种客户端的请求。使用功能生成的每个客户端的时间戳:根据时间戳对来自各种客户端的请求进行排序

public synchronized static long timestamp() 
{ 
    ts = ts+1; 
    return ts; 
} 

该函数存在于每个客户端在本地,并且当它发送一个消息到该服务器被调用。服务器有一个请求队列,它基本上是一个ArrayBlockingQueue。它保存从每个客户收到的请求。

客户端发送其ID和更新的时间戳(ts)。基于客户端发送的时间戳,我有什么办法可以在服务器端的队列中排序请求吗?

任何帮助将不胜感激。谢谢。

+2

'PriorityBlockingQueue'会起作用吗?您可以为时间戳定义一个比较器来提供订单。如果每个服务器都生成自己的序列号,那么您将会有重复的内容,并且不同意来自不同服务器的请求之间的“基于时间”的排序。根据负载的不同,来自最后一个客户端的启动请求可能始终排在后面的服务器的请求之后,并且永远不会被读取。这个问题还不清楚。 –

+0

在稍微分离的主题上,考虑将当前时间戳逻辑更改为使用AtomicLong,而不是同步并增加原始长度。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html –

回答

0

我不明白你为什么使用队列。队列是一个FIFO结构,不需要排序。您应该坚持队列,并希望请求以正确的顺序存储或使用不同的数据结构。

如何使用List<Object> objList = Collections.synchronizedList(new ArrayList<Object>());?这个结构可以很容易地排序!

+0

队列不一定是FIFO结构。虽然这可能是最常见的用途,但它当然不是唯一的用途。正如@Jim Garrison上面提到的,这似乎是PriorityQueue的一种情况。 http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html –

相关问题