繁体   English   中英

Java中的多线程通信

[英]MultiThreaded communication in Java

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

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

我建议使用某种消息系统。 最简单的方法是创建一个线程安全的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而不是数组,以便可以随意命名,添加和删除队列。 而不是成为queue [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。

如果您只是想要它们的“束”,而不必知道哪个是哪个(只是可以为一般任务提供线程的集合),那么在并发包中有特定的集合/模式。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM