2012-09-11 3 views
0

J'écris un programme, où un programme crée un thread qui lit à son tour à partir d'une socket, mon problème est que lorsque deux threads sont créés, les deux lire à partir du flux de données datain. Un thread lit correctement tandis que l'autre rencontre un EOS et renvoie -1 en octets lus. J'ai synchronisé ma méthode d'exécutionEOS atteint lorsque deux threads sont lus à partir de datainputstream

+1

Vous ne devez lire qu'un flux à l'aide d'un fil de discussion, sous peine de créer de la confusion. Vous n'avez pas besoin de synchroniser la lecture car elle est déjà sécurisée. Si vous obtenez un '-1', cela signifie que le flux est terminé. –

+0

La méthode de lecture bloque jusqu'à ce qu'un flux soit reçu correctement, dans ce cas il atteint EOS et renvoie -1, ce qui arrête le processus entier – Joy

+0

ce problème n'arrive que parfois, et parfois cela fonctionne bien .. ce n'est pas un problème arrive tout le temps. – Joy

Répondre

0

Doit être parce que le premier thread lire le flux jusqu'à EOF. Quel est le comportement attendu. Si vous voulez diviser la lecture, par exemple échangez les lecteurs après 100 octets, utilisez read(byte[] b, int off, int len) sinon lisez les données d'un fil puis partagez-le.

+0

J'utilise cela avec 0 et 4 comme mon offset et la longueur, les threads sont démarrés simultanément et utilisent le même programme pour lire .. et aussi la lecture de la même socket, un thread reçoit les données après l'autre et l'autre thread répond à l'aide du même programme – Joy

+0

@Joy Pourriez-vous poster la source? Peut-être que les threads ne cèdent jamais, mais c'est difficile à dire sans le code. – zeller

0

Ce que vous faites n'a pas de sens. Vous ne pouvez pas lire deux fois un flux, que ce soit séquentiellement ou simultanément. Dans ce cas, si le thread A lit le premier octet, le thread B ne peut pas lire le premier octet. Si le thread A lit tous les octets, le thread B ne peut en lire aucun.

+0

ce problème se produit seulement parfois, et parfois cela fonctionne bien .. ce n'est pas un problème qui se produit tout le temps. donc je suppose que je peux le faire – Joy

+0

@Joy au mieux vos threads lisent alternativement des nombres aléatoires d'octets du flux. Le fait de savoir si cela peut avoir un sens dépend entièrement de la façon dont vous le programmez. Vous auriez besoin de les synchroniser d'une manière ou d'une autre, à un niveau suffisamment élevé pour être sûr que chaque thread a lu ce qu'il voulait lire avant de permettre à l'autre thread de lire. Le fait que vous obteniez un comportement aléatoire indique que vous n'avez pas fait cela, et que vous ne faites que deviner que cela fonctionnera sans cela. Ça ne va pas. – EJP

Questions connexes