java网络接受线程之间的网络连接
问题描述:
在Java中,我创建了256个使用网络套接字相互通信的线程。 所有这256个线程并行运行。当一个线程被产生时,它会尝试连接到它的邻居线程。邻居列表可以是任意的。在这种情况下,如何保证所有的线程创建与他们的邻居java网络接受线程之间的网络连接
- 没有僵局
- 没有一个星型拓扑结构的连接(中心节点)
为了形成两者之间的连接线程,一个线程必须打开一个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中使用阻塞连接和接受方法。我有一种感觉,这可以使用非阻塞方法完成,但首先想知道其他想法。我的算法对于网状拓扑非常适用(至少我认为它的确如此)。
答
如果你的情况僵局意味着有这样的情况:
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
nope。如你所见,我已经这样做了。 ti只有在ti
2013-03-19 09:16:53
后才会尝试连接到tj,但后来我没有得到的部分是:您公开的邻居表在哪里产生或来自哪里?如果不是它的一种初始状态。我的意思是,在这种情况下't0 - > t3和t0 - > t3,t1'组合对于't1 - > t2,t0和t2 - > t1' – emecas 2013-03-19 09:31:12