In Java 1.4 +, Ci sono 3 modi per interrompere un flusso che viene bloccato sul socket I/O:rete interrompibile di I/O in Java
- Se la presa è stata creata usando un normale
java.net.Socket(InetAddress, int)
costruttore, Posso close it da un thread separato. Di conseguenza, unSocketException
viene generato nel thread bloccato. - Se il socket è stato creato utilizzando
SocketChannel.open(...)
.socket()
(I/O non bloccante) - di nuovo, è possibile chiuderlo da un thread separato, ma ora un'altra eccezione (unoAsynchronousCloseException
) viene generata nel thread bloccato. - Inoltre, nel caso si utilizzi l'I/O non bloccante, è possibile interrompere un thread bloccato, con un lancio di
ClosedByInterruptException
. L'interruzione di un thread bloccato quando si utilizza I/O Java vecchio stile non ha alcun effetto sul thread.
Domande:
- sta chiudendo una presa da un thread separato thread-safe quando si utilizza vecchio stile I/O? In caso contrario, quali sono le alternative?
- È in corso la chiusura di una presa/canale da una filettatura separata thread-safe quando si utilizza NIO?
- C'è qualche differenza nel comportamento di
Socket.close()
quando si utilizza NIO anziché IO normale? - Esistono vantaggi dell'utilizzo di NIO per il networking diverso da una possibilità di terminare un'operazione di I/O bloccata semplicemente interrompendo un thread (in modo che non sia più necessario mantenere un riferimento al socket)?