2013-03-19 1 views
0

En Java, je crée 256 threads qui communiquent entre eux en utilisant le socket réseau. Tous ces 256 threads s'exécutent en parallèle. Lorsqu'un thread est généré, il essaie de se connecter à ses threads voisins. La liste des voisins peut être arbitraire. Dans cette situation, comment faire en sorte que tous les fils créent un lien avec leurs voisinsjava network accepte la connexion réseau entre les threads

  1. sans blocage
  2. sans une topologie en étoile (nœud central)

Afin de former une connexion entre deux threads, un thread doit ouvrir un ServerSocket et d'autres thread doit rejoindre il. À l'heure actuelle, je suis en utilisant un algorithme simple:

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 

Comme vous pouvez le voir ci-dessus, je suis d'abord CONNexION à grands voisins et je suis en attente de plus petit voisin de se connecter à moi. Cela peut entraîner un blocage lorsque la table de quartier semble donné ci-dessous:

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

Tout algorithme spécifique dans votre esprit qui est une impasse libre ?? Mon algorithme utilise des méthodes de connexion et d'acceptation de blocage dans java. J'ai le sentiment que cela peut être fait en utilisant des méthodes non bloquantes, mais je veux d'abord connaître les autres idées. FYI, mon algorithme fonctionne parfaitement bien pour une topologie maillée (du moins je pense que oui).

Répondre

1

Si dans votre impasse cas signifie avoir cette situation:

ti -> tj and tj -> ti 

Pourquoi ne pas inclure dans les conditions, une nouvelle approche afin d'éviter cette situation, une partie supplémentaire comme suit:

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

pour le premier cas, si ti -> tj existent déjà, alors vous ne les acceptez pas d'établir tj -> ti

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

pour ce cas, 2ème cas, si tj -> ti existe déjà, alors vous n'établissez pas ti -> tj

+0

non. Comme vous le voyez, je le fais déjà. ti essaye de se connecter à tj seulement si ti

+0

désolé mais la partie que je ne comprends pas est: où est la table de voisinage que vous avez exposée ou qui vient? si ce n'est pas une sorte de condition initiale. Je veux dire pour ce cas 't0 -> t3 et t0 -> t3, t1' cette combinaison ne serait pas acceptable pour' t1 -> t2, t0 et t2 -> t1' – emecas