跨线程通信java

问题描述

| 因此,我是Java的新手,我做了一些c编程。 我试图建立一个虚拟的节点网络,每个节点都需要一个线程。 只允许节点与它们的邻居节点通话。 将有一个可以与任何节点对话的主节点,但是这些节点必须彼此对话才能返回到该主节点。邻居可以与主节点对话。 我本来打算保留节点的数组列表,但是后来我意识到所有节点都需要有自己的线程。 我的问题是如何在Java线程之间向前传递信息。 我需要能够使主节点为所有常规节点提供位置信息。 并且我需要常规节点能够将消息传递到其邻居常规节点。 这是我的git仓库,如果您想看看我现在要去的代码。 https://github.com/fieldju/cs372_project 在C语言中,我编写了一个程序,该程序使用管道让孩子们互相交谈,并且服务器连接了客户端,但是在这个问题中,要进行p2p通信的节点大部分都无法直接与主节点/服务器进行通信。 只是对那些希望查看结果的人的更新。我启动了节点并开始运行并进行通信,您可以在以下位置检查代码 https://github.com/fieldju/cs372_project 我仍在研究距离矢量的东西和其他一些东西,但是到下周结束时,整个事情都应该完成。     

解决方法

  我原本打算保持   节点的数组列表,但是我   意识到需要将所有节点   有自己的线程。 您可以保留一个线程数组,它仍将维护具有相同逻辑结构的每个节点线程。   我该如何传递信息   在Java中的线程之间转发。 如果线程驻留在同一进程中,那么套接字肯定是一个过大的杀伤力。我将使用一个或多个ConcurrentLinkedQueue实例来推送/弹出消息。 一个或几个真正取决于您所实现的通信类型。也许每个节点一个ConcurrentLinkedQueue,所以节点将消息推送到队列,每个节点都知道从何处弹出消息。 实施的一些提示 总结所有逻辑以在一个类中路由消息-我们将此类称为“ 0”。 “ 0”处理ConcurrentLinkedQueue的所有实例,并为所有线程提供用于发送/接收消息的方法的API。使“ 0”类的一个实例可被所有节点访问-通过在Thread构造函数上传递对该类的引用。 这是class3 class班的概况。注意,类
VirtualNetwork
Message
是必须实现自己的类。
class NodeThread extends Thread {

    private int nodeId;
    private VirtualNetwork network;

    public NodeThread(int nodeId,VirtualNetwork network) {
        this.network = network;
        this.nodeId = nodeId;
    }
    public void run() {
        /* when you have to send */
        int nodeReceptor = this.nodeId -1; /* neighbor in the array of threads */
        Message m = new Message(this.nodeId,nodeReceptor);
        m.setContent(10);
        network.send(m);

        /* when you have to receive */
        Message m = network.receive(this.nodeId);
        /* it\'s your decision to implement this in a blocking way or not */
    }
} 
    ,一种简单的(如果不是最佳的)开始方式是为需要在一个方向上传递值的每对线程创建一个
BlockingQueue
(如果它是双向的,则需要两倍的值)。     ,您肯定可以使用套接字。这里和这里都有一些教程/说明。您对项目的描述表明,由于您具有中央的“主节点”,因此客户机/服务器设置会很好地工作。主服务器将是服务器,其他线程将能够连接到主服务器/服务器以接收其更新。