Java中的多线程通信

时间:2013-01-30 17:01:09

标签: java multithreading

我创建了许多线程。我知道每个线程的名称(通过外来机制设置我设置线程的名称。)现在我在一个线程内,并希望向另一个线程发送消息。

我正在尝试编写Pastry和Chord协议的模拟器。我不能拥有多个分布式节点,所以我创建了许多线程。现在我希望每个线程彼此发送和接收消息。我已将每个节点名称设置为其IP(随机生成的数字)。现在我不知道如何从一个节点向另一个节点发送消息。如果您知道另一个线程名称,请告诉我如何从一个线程向另一个线程发送消息。

3 个答案:

答案 0 :(得分:2)

我会建议某种消息系统。最简单的方法是创建一个线程安全的FIFO并将其传递给每个线程。如果要将消息直接发送到每个不同的线程,请为每个线程创建一个“主题”。

不要试图破解使用线程名称的东西,它只是稍后限制你。

粘贴评论,以便我可以解析它:

private static BlockingQueue[] queue; 
private static int queueNum = 0; 
public static void newQueue(String ip) 
{
    queue[queueNum] = new ArrayBlockingQueue(1024); 
    try{ queue[queueNum].put(ip); }
    catch (InterruptedException e){e.printStackTrace(); } 
    queueNum++; 
}

哦,我看到了你的问题。您永远不会为BlockingQueue分配值。尝试将该行更改为:

private static BlockingQueue[] queue=new BlockingQueue[10]; 

这将允许你10个队列。

我还建议您使用HashMap代替数组,这样您就可以随意命名,添加和删除队列。而不是队列[2],你将解决queue.get(“Thread1Queue”)或更具描述性的问题。

注意对评论的回应: HashMap通常可以替换一个数组,它的查找几乎一样快,但它使用任何索引而不是数字 - 字符串,枚举,对象,无论你想要什么(只要它有哈希和等于方法覆盖),但通常是字符串。

因此,如果您要存储一堆队列,并且想要专门命名它们,您可以说:

HashMap queues=new HashMap();
queues.put("queue1", new ArrayBlockingQueue(1024));
queues.put("queue2",new ArrayBlockingQueue(1024));
...

然后,只要您想访问一个,您就可以使用:

queues.get("queue1").put(new ThingToAddToArrayBlockingQueue())...

向queue1添加“Thing to add”。

如果你只是想要它们的“束”并且不需要知道哪个是哪个(只是一个可以提供通用任务的线程的集合),那么在并发包中有特定的集合/模式。 / p>

答案 1 :(得分:1)

线程之间通信的通常方法是将对象传递给每个线程,然后允许它们之间进行通信。请记住,由多个线程访问的该对象的所有字段和方法都应为synchronized

但是当您想要模拟网络协议时,为什么不一直使用network sockets进行进程间通信?只需让每个线程在127.0.0.1上侦听不同的套接字。

答案 2 :(得分:0)

如果要发送消息然后让其他线程处理它们,则需要一个共享对象(队列,映射等),线程可以在其中传送消息。接收线程必须检查传入的消息,拉出它们并进行必要的处理。