2009-10-16 5 views
0
final DatagramChannel dc = DatagramChannel.open(); 
     dc.configureBlocking(false); 
     dc.socket().bind(localAddress); 
     final SelDatagramChannel c = new SelDatagramChannel(dc, datagramListener); 
--->>>>  final SelectionKey sk = dc.register(selector, SelectionKey.OP_READ); 

La ligne de marché se bloque à jamais lorsque vous essayez d'enregistrer un DatagramChannel.Java NIO UDP - Sélecteur se bloque en essayant d'enregistrer

Est-ce que quelqu'un sait pourquoi?

+0

Je pense que vous aurez besoin de poster un échantillon de code plus complet pour donner un peu de contexte à votre question. –

Répondre

0

Avez-vous essayé d'envoyer un CTRL + BREAK à la JVM pour obtenir un thread dump?

0

Le code ci-dessus est-il exécuté dans le thread qui sélectionne? Je pense que nous devons enregistrer les canaux avec Selector dans le même thread qui fait la sélection.

0

Il y a une conversation dans http://echelog.matzon.dk/logs/browse/java/1276898400 qui mentionne que dc.register() doit être appelée dans le fil de sélection. Le JavaDoc ne semble pas très spécifique à ce sujet, cependant.

Je suppose que vous faites cela en mettant une liste quelque part, et en appelant selector.wakeup(). Mais j'ai encore des problèmes de synchronisation où l'on ne sait pas combien de temps avant que le registre ne réussisse ...

Questions connexes