如何让2个线程相互通信?

时间:2010-10-29 16:38:43

标签: java multithreading

我目前正在用Java创建一个IRC机器人(我知道,那里有框架),我正在尝试将它连接到多个服务器。我遇到的问题不是连接部分,我只是在x线程中运行我的Connect类。每个线程都将bot连接到指定的服务器/端口。现在我的问题是,当用户输出某些文本时,机器人应该向通道发送消息“你输入了这个命令”(例如)。现在我希望机器人向所有服务器发送消息,说“你输入了这个命令”。这只是一个例子(这就是为什么它没有多大意义)。

Connect f = new Connect(irc.freenode.net, 6667);
Thread ft = new Thread(f);
ft.start();
Connect q = new Connect(irc.quakenet.org, 6667);
Thread qt = new Thread(q);
qt.start();

现在有了上面的示例代码,我想要一个线程在输入某些文本时与另一个线程交谈。类似的东西:

if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")) {
    message both servers "Hello World!" 
}

如果有人可以提供帮助,我会非常感激。谢谢!

6 个答案:

答案 0 :(得分:3)

我认为一个简单的方法是Observer pattern,其中每个线程都知道所有其他线程

答案 1 :(得分:1)

您应该为每个线程提供其他线程可以异步方式推送的传入消息的队列; java.util.concurrent.ConcurrentLinkedQueue可能是一个很好用的类。

然后,您将需要一个具有对所有线程的引用的MessageSender类实例。如果一个线程想要向所有其他线程发送消息,它将在这个全局MessageSender对象上调用send(msg),然后它将遍历所有线程并将消息推送到它们各自的队列(跳过该线程)发送者)。

线程本身可以不时检查自己的队列(取决于它们可能正在执行的其他逻辑)并在处理完消息后删除它们。

答案 2 :(得分:0)

最简单的解决方案是将公共对象传递给两个线程。在这种情况下,它可能只是String。例如:

String messagePasser;
Connect f = new Connect(irc.freenode.net, 6667, messagePasser);
Thread ft = new Thread(f);
ft.start();
Connect q = new Connect(irc.quakenet.org, 6667, messagePasser);
Thread qt = new Thread(q);
qt.start();

然后你的另一个例子变成:

if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")){
    messagePasser = "Hello, World!";
}

然后每个线程应不断检查messagePasser以查看它何时发生变化,然后输出消息。这显然是一个非常简单的建议,完全绕过了许多关于同步和线程安全的问题。

编辑:根据学习String s按值传递(每天学习新东西......),您只需要创建一个简单的MessagePasser对象,封装一个{{ 1}}以及您想要的任何其他数据。

答案 3 :(得分:0)

messagePasser解决方案不起作用,因为java中的字符串对象是按值传递的,而不是通过引用传递的。

答案 4 :(得分:0)

根据您的描述,我认为每个线程都在等待聊天中其他用户发来的消息。等待意味着它调用一些网络方法,该方法仅在消息到达时返回。一旦该消息到达,线程(可选地)生成答案,发布它然后继续等待。这就是为什么你有多个线程,对吗?

然而,这意味着线程只能在收到某些内容后发送内容。因为只有这样他们才能从等待状态中醒来。这意味着将命令响应“广播”到所有线程是不可行的。相反,接收线程必须将其发送到所有服务器(而其他线程仍在等待从这些服务器读取)。

换句话说:将服务器严格分配给线程。让任何线程发送到任何服务器。

答案 5 :(得分:0)

将每个帖子添加到一个集合中,比如列表并观察更新。只要有更新,就将其分发给每个线程。 (听起来像观察者......)!

相关问题