Unterbrechbare Netzwerk-E / A in Java

In Java 1.4+ gibt es drei Möglichkeiten, einen Stream zu unterbrechen, der an Socket-E / A blockiert ist:

Wenn der Socket mit einem regulären erstellt wurdejava.net.Socket(InetAddress, int) Konstruktor, ich kannSchließe es von einem separaten Thread. Infolgedessen aSocketException wird in den blockierten Thread geworfen.Wenn der Socket mit erstellt wurdeSocketChannel.open(...).socket() (nicht blockierende E / A) - es ist wieder möglich, ihn von einem separaten Thread zu schließen, aber jetzt eine andere Ausnahme (einAsynchronousCloseException) wird in den blockierten Faden geworfen.Wenn nicht blockierende E / A verwendet werden, ist es außerdem möglich, einen blockierten Thread mit einem zu unterbrechenClosedByInterruptException geworfen. Das Unterbrechen eines blockierten Threads bei Verwendung von Java I / O im alten Stil hat keine Auswirkungen auf den Thread.

Fragen:

Schließt einen Socket von einem separaten Threadthread-safe bei Verwendung von I / O im alten Stil? Wenn nicht, welche Alternativen gibt es?Schließt einen Socket / Kanal von einem separaten Threadthread-safe Wenn Sie stattdessen NIO verwenden?Gibt es einen Unterschied inSocket.close() Verhalten bei der Verwendung von NIO im Gegensatz zu regulären IO?Gibt es irgendwelche Vorteile der Verwendung von NIO für die Vernetzungaußer eine Möglichkeit, einen gesperrten E / A-Vorgang durch einfaches Unterbrechen eines Threads zu beenden (damit ich keinen Verweis auf den Socket mehr führen muss)?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage