0

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

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

4

3 回答 3

2

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

不要试图在使用线程名称时破解某些东西,它只会在以后限制你。

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

私有静态 BlockingQueue[] 队列;
私有静态 int queueNum = 0;
公共静态无效新队列(字符串 ip)
{
    queue[queueNum] = new ArrayBlockingQueue(1024);
    尝试{队列[queueNum].put(ip); }
    catch (InterruptedException e){e.printStackTrace(); }
    队列号++;
}

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

私有静态 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。

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

于 2013-01-30T17:07:54.833 回答
1

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

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

于 2013-01-30T17:04:31.890 回答
0

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

于 2013-01-30T17:34:51.670 回答