【问题标题】:Multiple Threads Sharing One Socket多个线程共享一个套接字
【发布时间】:2014-02-26 07:27:45
【问题描述】:

我有一个场景,多个线程需要在一个套接字上与外部系统通信。每个线程的消息都可以通过唯一的 id 来标识。 在所有线程共享同一个套接字的这种情况下,我可以使用 blockQueues。由于线程可以产生请求和消耗响应,我可以让单例组件说“Socketer”,他持有套接字并有两个 BlockQueue(传入和传出)。传出队列上的任何消息都写入套接字,并且来自套接字的任何消息都发送到传入队列。 socketer 还维护所有生产者线程的哈希表,当它读取响应时,它会识别相应的生产者并将响应交给它。s

请建议这是否是一种正确的设计方法或提出改进建议。我的线程实际上是 WebServices,我在 Spring 环境中。

谢谢

【问题讨论】:

    标签: java multithreading spring sockets


    【解决方案1】:

    我不明白您为什么需要哈希表,但您确实需要每个线程的响应队列。您可以将正确的响应队列嵌入到请求消息中。

    但是您确定不能打开与外部系统的多个连接吗?它会让你的生活变得更简单。

    【讨论】:

    • 仅在一个套接字上通信是必需的。请求消息是通过 TCP 发送的简单二进制序列。因为只有一个组件在套接字上读/写。它需要引用生产者/消息发送者线程,以便它可以将响应移交给正确的线程。这就是为什么我想拥有hastable,它将存储对所有发送请求并等待响应的线程的引用。
    • 然后呢?您最终将不得不将响应写入每个线程的队列。哈希表(如果存在)应将源线程映射到它们的消费者队列。仅在套接字上进行同步并避免额外的线程和所有队列可能更简单,除非额外的服务能够进行流水线操作。
    • 没有“消费者”队列。所有通信都在单个套接字上。
    • 每个线程都需要一个消费者队列,以便获得响应。
    • 每个线程的消费者队列是个好主意,谢谢。如果我在套接字上同步,这意味着所有线程都将等待直到 T1(持有套接字锁)完成写入请求并获得读取响应。与这种方法相比,线程进来,写入请求并进入等待(哈希表)怎么样。还有另一个线程正在监视套接字输入流。当响应进来时,它对应的线程被查找并且响应被移交给它。请建议
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2018-08-07
    • 1970-01-01
    相关资源
    最近更新 更多