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

Java 单个TCP套接字发送请求并等待响应的多线程FIFO队列,java,multithreading,sockets,tcp,queue,Java,Multithreading,Sockets,Tcp,Queue,下面是我当前的java实现: 使用线程从UDP套接字接收UDP包,将包放入非阻塞队列 300个线程中的一个读取此非阻塞队列,并将此数据包作为对连接到TCP主机/端口的套接字的请求进行处理 等待响应并将其返回到UDP套接字 这部分工作正常,但从高负载下的TCP套接字部分的分析中,我发现在随机情况下,完成TCP套接字部分可能需要2-5秒。通常这部分需要2-3毫秒。我的问题是,我只是用随机线程执行击中TCP套接字,并且没有线程操作的FIFO 是否有一种方法可以将“请求”信息加上当前线程引用(我想知道哪

下面是我当前的java实现:

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

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

    有没有一种方法可以将“请求”信息加上当前线程引用

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

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

    在服务器端,您可能会有一个类似的读写线程,它们都是从工作队列中消费的。

    我相信您正在寻找一个-下面是它的描述,我会强调一下

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


    单个线程是否正在执行阻塞TCP操作?或者你有没有把它们安排成非阻塞的?如果是,怎么做?为什么?你怎么知道这样排序会改变TCP响应时间?当UDP本身无序时,为什么顺序很重要?我希望这个盒子里有300个内核。@Keith我有以下内容:totcserver.println(message);response=fromTCPServer.readLine();在收到来自TCP服务器的响应之前,它会一直阻塞。@EJP UDP数据包是无序的,没有连接,但处理它们的线程在TCP套接字部分阻塞。我关心的是快速获得响应,否则原始UDP数据包发送者会认为响应失败。