2012-09-06 107 views
0

因此,继承人我目前的Java实现:FIFO队列发送请求,并等待响应

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

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

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

+0

各个线程是否阻止了TCP操作?还是你安排他们是非阻塞的?如果是这样,怎么样? –

+0

为什么?你怎么知道这样排序会改变TCP响应时间?当UDP本身无序时,为什么顺序很重要? – EJP

+0

我希望你的盒子里有300个核心。 –

回答

0

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

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

一旦你有请求计数器,那么TCP套接字将是一个请求/响应流,以便它们可以按需发送。一个线程将向远程服务器发送请求,另一个线程将读取响应并将响应安排回UDP客户端。如有必要,你可以保证FIFO的顺序,但如果另一个响应已经准备就绪,我不明白为什么它必须等待,因为它已经失灵。

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

0

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

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

相关问题