2013-03-19 108 views
0

在Java中,我创建了256个使用网络套接字相互通信的线程。 所有这256个线程并行运行。当一个线程被产生时,它会尝试连接到它的邻居线程。邻居列表可以是任意的。在这种情况下,如何保证所有的线程创建与他们的邻居java网络接受线程之间的网络连接

  1. 没有僵局
  2. 没有一个星型拓扑结构的连接(中心节点)

为了形成两者之间的连接线程,一个线程必须打开一个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

如果你的情况僵局意味着有这样的情况:

ti -> tj and tj -> ti 

为什么不能在条件包括,如为了避免这种情况,一个额外的一部分,后续的新方法:

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

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

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

对于这种情况第二种情况,如果tj - > ti已经存在,那么你不建立ti - > tj

+0

nope。如你所见,我已经这样做了。 ti只有在ti 2013-03-19 09:16:53

+0

后才会尝试连接到tj,但后来我没有得到的部分是:您公开的邻居表在哪里产生或来自哪里?如果不是它的一种初始状态。我的意思是,在这种情况下't0 - > t3和t0 - > t3,t1'组合对于't1 - > t2,t0和t2 - > t1' – emecas 2013-03-19 09:31:12