Wie interrupt-java.util.Scanner nextLine-call
Ich bin mit einer multi-threaded Umgebung wurden ein Thread wird ständig überwacht Benutzereingaben durch mehrmalige scanner.nextLine()
.
Um die Anwendung zu beenden, diese runloop wird beendet, indem ein anderer thread, aber der listening-thread wird nicht aufhören, bis einer der letzten Benutzer-Eingabe gemacht wurde (aufgrund der Sperrung Art der nextLine()
).
Schließen des Streams scheint nicht eine option, da ich das Lesen von System.in
gibt eine InputStream
ist nicht schließbar.
Gibt es eine Möglichkeit zu unterbrechen, die Sperrung des Scanners, so dass es zurückkehren wird?
Dank
- Sie können rufen Sie
scanner.hasNext()
stattscanner.nextLine()
diese Methode kann block entsprechend der javadoc, so müssen Sie möglicherweise, damit umzugehen. Die Idee ist, dass im Gegensatz zuscanner.nextLine()
,scanner.hasNext()
nicht im Voraus den Eingang, so dass Sie überprüfen können, eine Flagge wenn das Lesen-thread gestoppt wurde, durch einen anderen thread vor dem Aufrufscanner.nextLine()
- ja, aber das würde bedeuten, Konstante polling.
- Sie sollten in der Lage sein zu rufen Thread.interrupt auf der listening-thread, würde dies verursachen, eine InterruptedIOException können Sie von der ioException () - Methode. Nicht sicher, wie es interagiert mit nextLine - () oder wenn es funktioniert mit Ihrer zugrunde liegenden inputstream, aber es sollte kündigen nextLine-in den meisten Fällen.
- Nach meinen Tests, die eigentlich gar nicht kündigen
nextLine
- immer. Zumindest nicht für mich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Artikel beschreibt einen Ansatz zur Vermeidung von Blockierung beim Lesen. Es gibt das code-snippet, das Sie ändern könnte, wie ich die angeben, in einem Kommentar.
Konnte man entweder diesen code direkt, oder schreiben Sie eine neue verschließbare InputStream-Klasse, die Nachbereitung, die Logik in diesem Artikel beschrieben.
Sicher. Verwenden Sie eine nuke. Rufen Sie
System.exit(0)
am Ende der Haupt-thread. Dies wird Mord alles. Auch der aktive thread wartet im System.in.Das problem ist das System.in einem traditionellen input-stream mit Blockierung, und wenn es blockiert wird der thread entsprechend markiert ist, ausgeführt. Sie können nicht unterbrechen. Also, was auch immer Thema, das Sie verwenden, um Lesen Sie die System -.in ist der Aufruf zu Lesen-und das Lesen wird den thread blockiert. Sie können Koax paar Sachen mit ein paar tricks vermeiden Sie den Aufruf gelesen, außer in jenen Fällen, wenn wir können sicher sein, es gibt keine block-und dann ständig-Umfrage. Aber, es gibt keinen wirklichen Weg, um das problem, dass jeder Versuch zu Lesen, die sperren deinen thread und kein Betrag der Schließung zugrunde liegenden streams oder Unterbrechung oder Beendigung der Faden Sie sparen. Aber, wenn Sie die Ermordung der gesamten vm... der thread wird sterben.
Offensichtlich müssen Sie sicherstellen, dass der rest des threads nicht richtig beendet und es ist nur, dass man blöd, ich will in der Lage sein zu reagieren, um eingegebene Eingangs-thread, der ist der Letzte Hänger auf. Aber, wenn das absolut der Fall, die richtige Antwort ist, um zu beenden, oder zumindest, im Grunde die einzige Antwort, die arbeiten müssen, ohne zu brennen clock-Zyklen für keinen Grund, und lassen Sie das Programm beenden.
System.exit(0)
hörte nicht überraschend. Ich musstekill -9
den Prozess. Auchkillall java
hat nicht funktioniert.