繁体   English   中英

单个TCP套接字发送请求并等待响应的多个线程的FIFO队列

[英]FIFO queue of Multiple Threads for single TCP Socket send request and wait for response

所以这是我当前的Java实现:

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

这部分都可以正常工作,但是通过分析高负载下的TCP套接字部分,我发现在随机情况下,TCP套接字部分可能需要2到5秒钟才能完成。 通常这部分需要2-3毫秒。 我的问题是,我只是用随机线程执行命中TCP套接字,而我没有线程操作的FIFO。

有没有一种方法可以将“请求”信息和当前线程引用(我想知道哪个线程要处理“响应”)放入FIFO阻塞队列中,以确保最先处理最早的线程以确保TCP套接字请求/ response操作花费最少的时间。

有没有一种方法可以放置“请求”信息以及当前线程引用

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

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

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

我相信您正在寻找ConcurrentLinkedQueue-这是它的描述,其中有些是我的重点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM