0

所以继承人我当前的java实现:

  1. 使用线程从 UDP 套接字接收 UDP 包,将包放入非阻塞队列。
  2. 300 个线程中的一个读取此非阻塞队列并将此数据包作为对连接到 TCP 主机/端口的 Socket 的请求进行处理。
  3. 等待响应并将其返回给 UDP 套接字。

这部分一切正常,但是从高负载下 TCP 套接字部分的分析中,我发现在随机情况下,TCP 套接字部分可能需要大约 2-5 秒才能完成。通常这部分需要 2-3 毫秒。我的问题是我只是通过随机线程执行来访问 TCP 套接字,并且我没有线程操作的 FIFO。

有没有办法我可以将“请求”信息加上当前线程引用(我想知道哪个线程来处理“响应”)放入 FIFO 阻塞队列,以确保首先处理最旧的线程以确保 TCP 套接字请求/response 操作需要最少的时间。

4

2 回答 2

0

我相信您正在寻找一个ConcurrentLinkedQueue - 这是它的描述,我强调了一些。

基于链接节点的无界线程安全队列。此队列对元素进行 FIFO(先进先出)排序。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中时间最短的元素。新元素被插入到队列的尾部,队列检索操作获取队列头部的元素。当许多线程将共享对公共集合的访问时,ConcurrentLinkedQueue 是一个合适的选择。此队列不允许空元素。

于 2012-09-06T22:48:59.417 回答
0

有没有办法我可以放置“请求”信息加上当前线程参考

我会有一个AtomicLong请求计数器,每个请求都会增加。然后,计数器将与请求映射中的 UDP 套接字与任何其他每个请求信息相关联。计数器也将通过 TCP 套接字发送。来自 TCP 套接字的响应将与请求计数器一起返回,读取器线程将通过适当的 UDP 套接字将响应发送回或将其安排在线程池中。

一旦你有了请求计数器,那么 TCP 套接字将是一个请求/响应流,以便在必要时可以乱序发送它们。一个线程将向远程服务器发送请求,另一个线程将读取响应并将响应调度回 UDP 客户端。如有必要,您可以保证 FIFO 顺序,但如果另一个响应已准备好,我不明白为什么它必须等待只是因为它出现故障。

在服务器端,您将有一个类似的读取器和写入器线程都从工作队列中消耗。

于 2012-09-06T22:43:03.597 回答