Я использую RXTX для чтения данных с последовательного порта. Чтение выполняется в потоке, созданном следующим образом:
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();
Класс SerialReader реализует Runnable и просто зацикливается бесконечно, считывая данные из порта и собирая данные в полезные пакеты перед отправкой в другие приложения. Однако я сократил его до следующей простоты:
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);
}
}
}
Когда пользователь нажимает кнопку остановки, запускается следующая функция, которая теоретически должна закрыть входной поток и выйти из блокирующего вызова byteChan.read (buffer). Код выглядит следующим образом:
public void stop() {
t.interrupt();
serial.close();
}
Однако, когда я запускаю этот код, я никогда не получаю исключение ClosedByInterruptException, которое ДОЛЖНО запускаться после закрытия входного потока. Кроме того, выполнение блокируется при вызове serial.close () - потому что основной входной поток все еще блокирует вызов read. Я попытался заменить вызов прерывания на byteChan.close (), который затем должен вызвать AsynchronousCloseException, однако я получаю те же результаты.
Любая помощь в том, что мне не хватает, будет принята с благодарностью.