跨线程通信java

fie*_*dju 5 java networking multithreading distance bellman-ford

所以我是Java新手,我做了一些c编程.我正在尝试建立一个虚拟的节点网络,每个节点都需要成为一个线程.仅允许节点与其邻居节点通信.将有一个主节点可以与任何节点通信,但节点必须相互通信才能返回主节点.主节点邻居可以与主节点通信.

我本来打算保留一个节点的数组列表,但后来我意识到所有节点都需要有自己的线程.

我的问题是如何在Java中的线程之间传递信息.我需要能够让主节点给出所有常规节点的位置信息.我需要常规节点才能将消息传递给它们的邻居常规节点.

这是我的git回购,如果你想看看我现在的代码.

https://github.com/fieldju/cs372_project

在CI中制作了一个程序,使用管道让孩子们互相交谈,服务器连接客户端,但是在这个问题上,节点要进行p2p通信,因为大多数人不能直接与主节点/服务器通信


对于任何看过这个并希望看到结果的人来说,这只是一个更新.我已经启动并运行节点并进行通信,您可以查看代码

https://github.com/fieldju/cs372_project

我仍在研究距离矢量和其他一些东西,但到下周末,整个事情应该完成.

Man*_*res 4

我最初打算保留节点的数组列表,但后来我意识到所有节点都需要有自己的线程。

你可以保留一个线程数组,它仍然会维护一个具有相同逻辑结构的每个节点的线程。

如何在 Java 中的线程之间向前传递信息。

如果线程驻留在同一个进程中,那么套接字肯定是一种过度杀伤力。我会使用一个或多个ConcurrentLinkedQueue实例来推送/弹出消息。

一个或几个实际上取决于您正在实施的通信类型。也许每个节点有一个 ConcurrentLinkedQueue,因此节点将消息推送到队列,并且每个节点都知道从哪里弹出消息。

一些实施提示

将路由消息的所有逻辑封装在一个类中 - 我们将这个类称为VirtualNetworkVirtualNetwork处理 ConcurrentLinkedQueue 的所有实例,并向所有线程提供用于发送/接收消息的方法 API。通过在 Thread 构造函数上传递对它的引用,使该类的一个实例VirtualNetwork可供所有节点访问。

这是你的班级的草图NodeThread。请注意,类VirtualNetworkMessage是您必须自行实现的类。

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 */
    }
} 
Run Code Online (Sandbox Code Playgroud)