Прерывание потока не завершает блокирующий вызов при чтении входного потока

Я использую 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 (), поскольку базовый входной поток все еще блокирует вызов чтения. Я' Я попытался заменить вызов прерывания на byteChan.close (), который затем должен вызвать AsynchronousCloseException, однако я получаю те же результаты.

Любая помощь в том, что мне не хватает, будет очень признательна.

10
задан JDS 1 October 2010 в 22:11
поделиться