如何在多个线程之间传递数据和信号

时间:2013-10-08 22:23:47

标签: java multithreading

我需要编写一个多线程java应用程序,我将创建多个线程来处理不同类型的操作。例如,一个线程将监视应用程序的状态,一个线程将管理与集群中其他节点的通信,一个线程将具有一些应用程序逻辑等等。

在线程之间传递数据和信号的好方法是什么?例如,应用程序逻辑线程可能需要发送一条消息,该消息可以传递给通信线程。这里需要在两个线程之间传输数据。我认为的一种方法是使用一个队列,其中所有想要发送消息的线程都可以插入它们的消息。但是,它几乎没有问题:

  1. 用于插入的队列和方法需要是静态的
  2. 希望发送消息的每个线程都必须具有通信线程的对象
  3. 此外,如果发送失败(例如,抛出异常),这样的send方法将无法告诉调用线程,因为一旦将消息插入队列中,调用线程认为它发送了它的消息。

    在这些应用程序的线程之间传递信号和数据的好方法是什么?

    对于软件工程师来说,这可能是一个非常基本的问题(我来自电子背景)。如果是这样,有人能指出一个很好的资源,我可以阅读有关设计多线程或多处理应用程序的信息吗?

    非常感谢。

1 个答案:

答案 0 :(得分:1)

我最近在类似的问题上发布了here

您正在寻找BlockingQueue,正如其中显示的代码所示,它们很容易使用。

你的观点:

  

用于插入的队列和方法需要是静态的

否 - 正如您在示例中所看到的,如果您构建队列并将其传递给希望进行通信的两个对象(或者将它们全部保存在Map中,就像我在答案中所做的那样)它们可以工作非常愉快地在一起。

  

希望发送消息的每个线程都必须具有通信线程的对象

不 - 只是队列。

  

此外,如果发送失败,这样的发送方法将无法告诉调用线程......

仅仅因为你把消息放入队列并不意味着你无法掌握它。您可以等待另一个线程更改它并对其进行响应,或者您可以有两个队列,一个用于消息,一个用于响应,或者在按摩中设置一个信号量,当消息被执行时会被触发。这就像连接电路一样。

来自电子背景并不意味着你必须道歉 - 有人必须保持灯光。 {笑容}