【问题标题】:Java Message passing among threads线程间的 Java 消息传递
【发布时间】:2021-03-27 04:12:33
【问题描述】:

我是 Java 新手,一直被线程消息传递的问题困扰。 我的意思是-我有 4 个线程,一个线程从网络读取 msg,并根据 msg 的类型将 msg 传递给解析器线程或数据库线程。数据库线程执行一些操作,并且必须将 msg 发送回第一个将其放入套接字的网络线程。同样,解析器线程也执行一些操作,并根据结果将 msg 发送回网络线程或数据库线程。 我尝试过的事情-

  1. 我已经阅读了关于 notify() wait() 用于线程通信的信息,这对我的情况没有帮助,因为我需要一对一的消息传递而不是全部广播
  2. 我已经阅读了有关并发队列阻塞队列的信息 - 因为这不是一个理想的生产者消费者问题,其中一个线程正在生成消息,而其他线程从中读取 - 我不能使用它。 使用它就像我需要为每个通信通道设置 5 个队列
network->db,
db->network,
parser->network,
parser->db

这样做有效率吗?

在 c++ 中,我使用了消息机制,我过去只是将 msg(windows msg) 发布到相应线程的消息池中,并且在其消息池中的那个线程会获取它

有没有像java中的消息传递这样的机制我可以使用?

【问题讨论】:

标签: java multithreading message-queue


【解决方案1】:

一个线程从网络读取 msg 并根据 msg 的类型将 msg 传递给 ...数据库线程。数据库线程执行一些操作,并且必须将 msg 发送回第一个将其放入套接字的网络线程。

您正在让“网络”线程负责等待来自网络的消息,并等待来自“数据库”线程的消息。尴尬了。您可能会发现它介于轻度困难和不可能以干净、令人满意的方式实现之间。

我个人的看法是,多线程程序中的每个长寿命线程应该只等待一件事。

让数据库线程“将消息发送回第一个网络线程[要放入]套接字的原因是什么?”为什么数据库线程本身不能把消息放入socket?

如果数据库有充分的理由不发送消息,那么为什么“将消息放入套接字”不能成为您的数据库线程提交给 任务 >thread pool?


我已经阅读了关于线程通信的 notify() wait() 对我的情况没有帮助

BlockingQueue 有帮助吗?

我已经阅读了有关并发队列阻塞队列的信息 - 因为这不是一个理想的生产者消费者问题,其中一个线程正在生成 msgs 而其他线程从它读取 - 我不能使用它。使用它就像我需要为每个通信通道设置 5 个队列。

然后呢?如果向程序添加更多队列或更多线程使这些线程所做的工作更简单,或者使对这些队列的解释更容易理解,那会是一件坏事吗?


注意wait()notify()。这些是低级方法,旨在以非常特定的方式用于构建更高级别的机制。我不知道标准的 Java BlockingQueue 实现是否实际上确实使用了wait()notify(),但实现一个实际上确实使用了该机制的BlockingQueue 并不难。所以,如果BlockingQueue 解决了您的问题,那么这意味着wait()notify() 解决了您的问题。你只是没有看到解决方案。

事实上,我愿意打赌wait()notify() 可以用来解决任何需要一个线程等待另一个线程的问题。只是看看你还需要围绕它们构建什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多