Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跨线程通信_Java_Multithreading_Networking_Distance_Bellman Ford - Fatal编程技术网

Java 跨线程通信

Java 跨线程通信,java,multithreading,networking,distance,bellman-ford,Java,Multithreading,Networking,Distance,Bellman Ford,所以我是Java新手,我做过一些c编程。 我正在尝试创建一个虚拟的节点网络,每个节点都需要是一个线程。 这些节点只允许与其邻居节点通信。 将有一个主节点可以与任何节点通信,但节点必须相互通信才能返回主节点。主节点邻居可以与主节点对话 我本来打算保留一个节点数组列表,但后来我意识到所有节点都需要有自己的线程 我的问题是如何在Java中的线程之间向前传递信息。 我需要能够让主节点给出所有常规节点的位置信息。 我需要常规节点能够将消息传递给它们的邻居常规节点。? 这是我的git回购协议,如果你想看看我

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

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

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

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

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


只是一个更新,为任何人谁看了这一点,并希望看到结果。我让节点运行起来,你可以在

我仍在研究距离向量和其他一些东西,但到下周末,整个工作都应该完成。

你肯定可以使用。有两个教程/说明和。您对项目的描述表明,客户机/服务器设置会很好地工作,因为您有一个中心“主节点”。主线程将是服务器,其他线程将能够连接到主/服务器以接收其更新

我本来打算做一个 数组中的节点列表,但我 实现了所需的所有节点 有自己的线索

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

如何将信息传回 在Java中在线程之间转发

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

一种或几种真正取决于您正在实施的通信类型。每个节点可能有一个ConcurrentLinkedQueue,因此节点将消息推送到队列中,每个节点都知道从何处弹出消息

实施提示不多

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

这是一个关于类
NodeThread
的草图。请注意,类
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 */
    }
} 

一种简单(如果不是最佳)的开始方式是为需要在一个方向上传递值的每对线程创建一个新的路径(如果是双向的,则需要两倍的路径)。

无需更多关于网络应该做什么、其拓扑结构以及消息的意图和内容的详细信息,我怀疑这个问题的答案太宽泛了。您希望有多少个节点?对于完整的read me,但示例输入文件在1000*1000网格上有10个节点和一个主节点,您可以使用距离forumla来计算邻居权限,因此节点可以是一个具有P-C输入队列的线程,maybee在等待过程中有一个超时,这样它可以偶尔自己生成一些“传感器数据”以发送回主节点。节点最初会“以最大功率广播”,试图从主节点获取其位置,它可能会发送一些ID,以便主节点知道它是哪一个?主机可以通过多个路由(可能是reg)获得注册消息。消息应该计算跳数并存储跳数中使用的累积功率,以便使主节点能够通知子节点其最便宜的路由。我很喜欢这样的说法,我的主要问题是如何将消息推送到特定节点?希望一些阅读能给你一些启示。你必须原谅我的Java迟钝,因为我是一名c程序员。如果我有一个arraylist/线程数组,并将其推送到所有节点。它只是指向内存中线程的指针数组吗?就像在c中一样。@fieldju您可以通过向与该线程相关联的队列(您可以将该队列视为收件箱)发送消息来完成此操作,其中每个节点/线程可能有一个单独的队列。@fieldju。该数组包含对所述场景中线程的引用。引用有点像指针。请原谅,如果我把混乱搞得更糟了,但我认为,java中的所有东西(非原语)都是指针,无论何时使用它,它都会自动取消引用。您不能直接使用它们(指针),因为它只是假设您总是以相同的方式使用它们。所以是的,如果你有一个列表myList,你可以执行Thread-Thread=myList.get(i)并在上面调用方法,它会自动取消引用