所以我现在的java实现:
这部分一切正常,但是从高负载下的TCP套接字部分的分析,我已经看到在随机的情况下,TCP套接字部分可能需要大约2-5秒才能完成。通常这部分需要2-3毫秒。我的问题是,我只是用随机线程执行命中TCP套接字而且我没有线程操作的FIFO。
有没有办法可以将'请求'信息加上当前线程引用(我想知道将哪个线程处理'响应')放入FIFO阻塞队列,以确保首先处理最旧的线程以确保TCP套接字请求/响应操作只需要最少的时间。
答案 0 :(得分:0)
有没有办法可以提出“请求”。信息加当前线程参考
我会有一个AtomicLong
请求计数器,它会针对每个请求递增。然后,计数器将与请求映射中的UDP套接字相关联,并具有任何其他每请求信息。计数器也将通过TCP套接字发送。来自TCP套接字的响应将返回请求计数器,读取器线程将通过适当的UDP套接字发回响应或在线程池中调度它。
一旦有了请求计数器,那么TCP套接字将成为请求/响应流,以便在必要时可以不按顺序发送它们。线程将向远程服务器发送请求,另一个线程将读取响应并将响应调度回UDP客户端。如果有必要,您可以保证FIFO订单,但如果另一个响应准备就绪,我不明白为什么它必须等待,因为它已经无序。
在服务器端,你会有一个类似的读写器线程都在工作队列中消耗。
答案 1 :(得分:0)
我相信你会寻找ConcurrentLinkedQueue - 这是它的描述,我的一些重点。
基于链接节点的无界线程安全队列。此队列命令元素 FIFO(先进先出)。队列的 head 是队列中最长时间的元素。队列的尾部是队列中最短时间的元素。新元素插入队列的尾部,队列检索操作获取队列头部的元素。当许多线程将共享对公共集合的访问权时,ConcurrentLinkedQueue是一个合适的选择。此队列不允许null 元素。