多个线程的FIFO队列,用于单个TCP Socket发送请求并等待响应

时间:2012-09-06 22:39:50

标签: java multithreading sockets tcp queue

所以我现在的java实现:

  1. 使用线程从UDP套接字接收UDP包,将数据包放入非阻塞队列。
  2. 300个线程中的一个读取此非阻塞队列,并将此数据包作为对连接到TCP主机/端口的Socket的请求进行处理。
  3. 等待响应并将其返回UDP套接字。
  4. 这部分一切正常,但是从高负载下的TCP套接字部分的分析,我已经看到在随机的情况下,TCP套接字部分可能需要大约2-5秒才能完成。通常这部分需要2-3毫秒。我的问题是,我只是用随机线程执行命中TCP套接字而且我没有线程操作的FIFO。

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

2 个答案:

答案 0 :(得分:0)

  

有没有办法可以提出“请求”。信息加当前线程参考

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

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

在服务器端,你会有一个类似的读写器线程都在工作队列中消耗。

答案 1 :(得分:0)

我相信你会寻找ConcurrentLinkedQueue - 这是它的描述,我的一些重点。

  

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