java network接受线程之间的网络连接

时间:2013-03-19 08:49:41

标签: java multithreading deadlock minimum-spanning-tree

在Java中,我正在创建256个线程,这些线程使用网络套接字相互通信。 所有这256个线程并行运行。生成线程时,它会尝试连接到其相邻线程。邻居列表可以是任意的。在这种情况下,如何确保所有线程与其邻居建立连接

  1. 没有死锁
  2. 没有星形拓扑(中心节点)
  3. 为了在两个线程之间形成连接,一个线程必须打开 ServerSocket ,其他线程必须加入它。目前,我使用的是一种简单的算法:

    for all edges
    do
       if edge.tid > my tid
       then
          connect to edge.ip
       endif   
    done
    
    for all edges
    do
       if edge.tid < my tid
       then
           accept connection from edge.ip
       endif
    done
    

    如上所述,我首先连接到较大的邻居,然后我等待较小的邻居连接到我。当邻域表看起来如下所示时,这可能导致死锁:

    t0 -> t3, t1 
    t1 -> t2, t0
    t2 -> t1
    t3 -> t0
    

    你心中的任何特定算法都是无死锁的? 我的算法在java中使用阻塞连接和接受方法。我有一种感觉,这可以使用非阻塞方法完成,但想先了解其他想法。

    仅供参考,我的算法非常适合网状拓扑(至少我认为它确实如此)。

1 个答案:

答案 0 :(得分:1)

如果在您的情况下死锁意味着出现这种情况:

ti -> tj and tj -> ti

为什么不在条件中包括作为一种新方法以避免这种情况,另外一部分如下:

if edge.tid > my tid and edge is not already connected to my tie

对于第一种情况,如果ti - >; tj已经存在,那么你不接受建立tj - &gt; TI

if edge.tid < my tid and my tie is not already connected to edge

对于这种情况第二种情况,如果tj - >; ti已经存在,那么你没有建立ti - &gt; TJ