我可以使用PipedStreams将数据从一个线程发送到多个线程吗?

随时旅行者

我正在编程一个多线程服务器,并且每个客户端套接字连接都有一个线程。我想将数据从主线程来回传递给客户端线程。

我必须设置多少个线程?

它是这样工作的吗?

[服务器类别:]

private PipedInputStream serverInputStream = new PipedInputStream();
private PipedOutputStream serverOutputStream = new PipedOutputStream();
public PipedInputStream clientInputStream = new PipedInputStream();
public PipedOutputStream clientOutputStream = new PipedOutputStream();

serverInputStream.connect(clientOutputStream);
clientInputStream.connect(serverOutputStream);

还是我必须为每个客户端设置这四个流?

我很抱歉这个问题可能是愚蠢的,但是我已经将其视为可能并尝试了。如果有更好的方法来处理线程之间的通信,请教育我!

我写了一个小类,等待缓冲读取器阻塞并将消息添加到队列中:

public class DataListener implements Runnable {

    private InputStream is;
    private ConcurrentLinkedQueue<String> messages;
    private boolean closed = false;

    public DataListener(InputStream is, ConcurrentLinkedQueue<String> messages) {
        this.is = is;
        this.messages = messages;
    }

    @Override
    public void run() {
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        while (!closed) {
            try {
                messages.add(br.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void close() {
        closed = true;
    }
}

您能告诉我这是否是解决阻塞的侦听器的好方法吗?

两个

使用流将数据从一个线程传递到另一个线程绝对不是一个好主意,因为:

  • 流IO正在阻止操作,这会使线程处于保留状态。
  • 默认情况下,流(通常)不是线程安全的,这可能会导致各种问题。

如果要经常在线程之间传递数据,请尝试不惜一切代价避免阻塞,因为否则服务器线程将在大多数时间等待。Java提供了广泛的非阻塞数据交换功能工具集,您可以使用它来代替,您可以在Concurrent Package中找到它

一种非常简单但有效且快速的数据交换方法是使用消息样式系统:

final ConcurrentLinkedQueue<MyMessageClass> messages = new ConcurrentLinkedQueue<MyMessageClass>();

public void addMessage(final MyMessageClass message) {
  messaged.add(message);
}

protected void serverLoop() {
  //...
  final MyMessageClass message = messages.poll(); // does not block, returns null if none is available
  if (message != null) {
    handleMessage(message);
  }
  //...
}

您可以将类之类LinkedBlockingQueue用于其他功能,例如临时阻止。

但是,在线程化方面,大多数问题只能通过针对当前问题使用正确的体系结构来解决。对于所有线程任务,都没有“金锤子”解决方案,如果您希望代码完美运行,则需要找到适当的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C Linux pthread:使用消息队列将数据从一个线程发送到另一个线程会产生意外结果

来自分类Dev

Android将数据从主UI线程发送到另一个线程

来自分类Dev

将输入从一个线程子流程发送到另一个

来自分类Dev

我们可以将数据从一个android设备直接发送到另一个android设备(p2p),而无需在中间使用服务器吗?

来自分类Dev

从一个动作结果将数据发送到两个或多个视图

来自分类Dev

将数据从一个活动发送到多个活动

来自分类Dev

我可以使用交换机将高带宽信号从多个100Mbps节点发送到一个中央1000Mbps节点吗?

来自分类Dev

两个或多个类可以将数据发送到同一IntentService吗?

来自分类Dev

我可以将Intent发送到另一个应用程序吗

来自分类Dev

如何使用JavaScript将数据从一个.window发送到另一个?

来自分类Dev

如何使用JavaScript将数据从一个.window发送到另一个?

来自分类Dev

使用 Maven 和 Jetty 将数据从一个 JSP 文件发送到另一个

来自分类Dev

如何将泛型T发送到另一个线程?

来自分类Dev

将数据从一个活动发送到另一开始活动

来自分类Dev

CloudKit可以用于存储数据并从一个用户发送到另一个用户吗?

来自分类Dev

将数据发送到另一个PHP文件以使用电子邮件中的数据

来自分类Dev

我可以使用Javascript将http请求发送到特定的IP地址吗?

来自分类Dev

我可以使用一个命令发送多个嵌入吗?Discord.js

来自分类Dev

我可以在将命令输出发送到文件(一个划线员)之前处理命令输出吗?

来自分类Dev

使用CloudFront和Amazon S3或另一CDN,我可以将所有类似的请求发送到一个静态文件吗?

来自分类Dev

我可以将文件从一个项目文件夹发送到 C# web 中的另一个项目文件夹吗

来自分类Dev

我们可以使用 SharedPreference 将数据从一个 Activity 共享或传输到另一个 Activity 吗?

来自分类Dev

我正在尝试使用jquery和ajax将多个数据发送到另一个页面,以检查数据库中是否存在值

来自分类Dev

我正在尝试使用jquery和ajax将多个数据发送到另一个页面,以检查数据库中是否存在值

来自分类Dev

我可以使用gulp将内容从一个文件插入另一个文件吗?

来自分类Dev

我需要在 Android 中不断地将数据从一个活动发送到另一个活动

来自分类Dev

我无法通过单击一个按钮将多个数据发送到新活动

来自分类Dev

将数据从一个Java应用程序发送到另一个

来自分类Dev

如何将数据从一个片段发送到另一个片段?

Related 相关文章

  1. 1

    C Linux pthread:使用消息队列将数据从一个线程发送到另一个线程会产生意外结果

  2. 2

    Android将数据从主UI线程发送到另一个线程

  3. 3

    将输入从一个线程子流程发送到另一个

  4. 4

    我们可以将数据从一个android设备直接发送到另一个android设备(p2p),而无需在中间使用服务器吗?

  5. 5

    从一个动作结果将数据发送到两个或多个视图

  6. 6

    将数据从一个活动发送到多个活动

  7. 7

    我可以使用交换机将高带宽信号从多个100Mbps节点发送到一个中央1000Mbps节点吗?

  8. 8

    两个或多个类可以将数据发送到同一IntentService吗?

  9. 9

    我可以将Intent发送到另一个应用程序吗

  10. 10

    如何使用JavaScript将数据从一个.window发送到另一个?

  11. 11

    如何使用JavaScript将数据从一个.window发送到另一个?

  12. 12

    使用 Maven 和 Jetty 将数据从一个 JSP 文件发送到另一个

  13. 13

    如何将泛型T发送到另一个线程?

  14. 14

    将数据从一个活动发送到另一开始活动

  15. 15

    CloudKit可以用于存储数据并从一个用户发送到另一个用户吗?

  16. 16

    将数据发送到另一个PHP文件以使用电子邮件中的数据

  17. 17

    我可以使用Javascript将http请求发送到特定的IP地址吗?

  18. 18

    我可以使用一个命令发送多个嵌入吗?Discord.js

  19. 19

    我可以在将命令输出发送到文件(一个划线员)之前处理命令输出吗?

  20. 20

    使用CloudFront和Amazon S3或另一CDN,我可以将所有类似的请求发送到一个静态文件吗?

  21. 21

    我可以将文件从一个项目文件夹发送到 C# web 中的另一个项目文件夹吗

  22. 22

    我们可以使用 SharedPreference 将数据从一个 Activity 共享或传输到另一个 Activity 吗?

  23. 23

    我正在尝试使用jquery和ajax将多个数据发送到另一个页面,以检查数据库中是否存在值

  24. 24

    我正在尝试使用jquery和ajax将多个数据发送到另一个页面,以检查数据库中是否存在值

  25. 25

    我可以使用gulp将内容从一个文件插入另一个文件吗?

  26. 26

    我需要在 Android 中不断地将数据从一个活动发送到另一个活动

  27. 27

    我无法通过单击一个按钮将多个数据发送到新活动

  28. 28

    将数据从一个Java应用程序发送到另一个

  29. 29

    如何将数据从一个片段发送到另一个片段?

热门标签

归档