Ho una domanda di base. Perché e come il metodo di registrazione di SelectableChannel può essere nella chiamata di blocco. Consentitemi di fornire uno scenario.Blocco thread Java durante la registrazione del canale con selettore mentre viene chiamato select(). Cosa fare?
Ho creato un oggetto Selector nel registro di classe come segue.
private static Selector selector = Selector.open();
Ho anche un metodo nella stessa classe (Registro) per registrare il canale con il selettore.
public static SelectionKey registerChannel(SelectableChannel channel,
int ops) throws IOException {
channel.configureBlocking(false);
return channel.register(selector, ops);
}
E c'è un'altra classe di nome request, che ha metodo che legge i dati provenienti da canali, i processi e le chiamate seguente metodo per registrare il canale.
selectonKey = Register.register(socketChannel, SelectionKey.OP_READ);
Qui a questo punto il thread è bloccato, non dando la chiave di ciò che sta aspettando. Ho verificato che il selettore è aperto. Per favore forniscimi un aiuto per capire come posso risolvere questo problema. C'è un blocco che posso rilasciare.
Qualsiasi input sarebbe apprezzato.
In aggiunta a ciò che ho descritto. Ulteriori test hanno rivelato che se il metodo Register.register viene chiamato dallo stesso thread, è in grado di registrarsi ma dopo di ciò se qualche altro thread tenta di richiamare il metodo, thread non si muove avanti.
+1 per l'esempio di codice. Io secondo questo, per esperienza. Ben fatto. – casey
Questo aggiunge fino a 500 ms di latenza non necessaria per ogni registrazione. Utilizza invece l'approccio in http://stackoverflow.com/a/2179612/448970. –
@DavidB. Non aggiunge alcuna latenza ad ogni registrazione. È il thread di selezione che blocca fino a 500ms, non il thread di registrazione, e il thread di selezione vorrà sempre bloccare in 'select()' comunque. Le affermazioni nella risposta sono per lo più errate. – EJP