[英]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。
如果您只是想要它们的“束”,而不必知道哪个是哪个(只是可以为一般任务提供线程的集合),那么在并发包中有特定的集合/模式。
如果要发送消息然后由其他线程处理它们,则需要一个共享对象(队列,映射等),线程可以将消息泵入其中。 接收线程必须检查传入消息,将其提取并进行必要的处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.