Thread unterbrechen, nicht beenden blockierenden Aufruf auf die Eingabe-stream Lesen
Ich bin mit RXTX zum Lesen von Daten von einem seriellen port. Die Lesung ist getan innerhalb ein thread erzeugt, in der folgenden Art und Weise:
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(port);
CommPort comm = portIdentifier.open("Whatever", 2000);
SerialPort serial = (SerialPort)comm;
...settings
Thread t = new Thread(new SerialReader(serial.getInputStream()));
t.start();
Den SerialReader-Klasse implementiert Runnable und einfach Schleifen auf unbestimmte Zeit, Lesung aus dem Hafen und der Konstruktion der Daten in sinnvolle Pakete vor dem senden Sie es aus, um andere Anwendungen. Ich habe allerdings reduziert Sie sich auf die folgenden der Einfachheit halber:
public void run() {
ReadableByteChannel byteChan = Channels.newChannel(in); //in = InputStream passed to SerialReader
ByteBuffer buffer = ByteBuffer.allocate(100);
while (true) {
try {
byteChan.read(buffer);
} catch (Exception e) {
System.out.println(e);
}
}
}
Wenn ein Benutzer klickt auf eine Schaltfläche beenden, wird die folgende Funktionalität feuert das sollte in der Theorie schließen die Eingabe-stream und brechen aus der Sperrung byteChan.read(buffer) aufrufen. Der code ist wie folgt:
public void stop() {
t.interrupt();
serial.close();
}
Allerdings, wenn ich diesen code ausführen, bekomme ich nie eine ClosedByInterruptException, SOLLTE das Feuer einmal den input-stream schließt. Darüber hinaus die Ausführung der Blöcke auf den Aufruf von serial.close () - weil das zugrunde liegende input-stream ist immer noch blockiert, die auf der read aufrufen. Ich habe versucht, anstelle der interrupt-Aufruf mit byteChan.close () sollte dann die Ursache für ein AsynchronousCloseException, aber ich bekomme die gleichen Ergebnisse.
Jede Hilfe auf das, was mir fehlt, wäre sehr dankbar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man nicht machen einen stream, der nicht unterbrechbare I/O in ein
InterruptibleChannel
einfach durch das einwickeln von es (und jedenfallsReadableByteChannel
erweitern nichtInterruptibleChannel
).Haben Sie Blick auf den Vertrag von der zugrunde liegenden
InputStream
. Was bedeutetSerialPort.getInputStream()
sagen über die interruptibility des Ergebnisses? Wenn es nicht sagen, nichts, sollten Sie davon ausgehen, dass es ignoriert unterbricht.Für I/O, die nicht ausdrücklich unterstützt interruptibility, die einzige option ist in der Regel schließen des Streams aus einem anderen thread. Dies kann bringen sofort eine
IOException
(obwohl es vielleicht nicht eineAsynchronousCloseException
) in den thread blockiert bei einem Aufruf auf den stream.Aber selbst das ist extrem abhängig von der Implementierung des
InputStream
—und das zugrunde liegende OS kann ein Faktor sein, der zu.Hinweis: das source-code-Kommentar über die
ReadableByteChannelImpl
Klasse zurückgegebennewChannel()
:RXTX SerialInputStream (was zurückgegeben wird, durch die serielle.getInputStream () - Aufruf) unterstützt eine timeout-Regelung, die herauf die Lösung all meiner Probleme. Hinzufügen der folgenden Elemente vor dem erstellen des neuen SerialReader Objekt Ursachen der liest nicht mehr zu blockieren:
Innerhalb der SerialReader Objekt, ich musste ein paar Dinge ändern, um zu Lesen, direkt aus dem InputStream erstellen, anstatt die ReadableByteChannel, aber jetzt kann ich stoppen und starten Sie den reader, ohne Frage.
bin ich mit dem nachstehenden code, um das Herunterfahren rxtx. ich tests ausführen, beginnen Sie und stoppen Sie Sie nach unten, und das scheint zu funktionieren ok. mein reader sieht so aus:
Dank