java - Java中的多线程通信

标签 java multithreading

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

我正在尝试编写 Pastry 和 Chord 协议(protocol)的模拟器。我不能有多个分布式节点,所以我创建了多个线程。现在我希望每个线程相互发送和接收消息。我已将每个节点名称设置为其 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 通常可以替换数组,它的查找速度几乎一样快,但它使用任何东西作为索引而不是数字——字符串、枚举、对象,任何你想要的东西(只要它重写了 hash 和 equals 方法),但是通常是字符串。

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

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

然后每当您想访问时都可以使用:

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

将“要添加的事物”放入队列1。

如果您只想要其中的“一堆”并且不需要知道哪个是哪个(只是可以提供通用任务的线程集合),则并发包中有特定的集合/模式。

关于java - Java中的多线程通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14609548/

相关文章:

java - 更改请求的正文

java - 将文本字符串转换为替代表示形式(二进制、十六进制、ascii)

python - 静态方法和线程安全应用程序

c# - for 循环问题中的 System.Threading.Tasks

java - Servlet 输出流响应出现问题

java - SQL 表达式的 HQL 查询模拟

java - Tomcat DataSourceRealm 只工作一次

c++ - OpenMP 并行峰值

c# - Ado.net 从多线程调用存储过程比单线程慢

c++ - 线程、信号和子处理 : What a world. ..多么美好的世界