当前位置: 首页 > 面试题库 >

线程中断未结束对输入流的读取的阻塞调用

法子昂
2023-03-14
问题内容

我正在使用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,但是,我得到的结果相同。

我所缺少的任何帮助将不胜感激。


问题答案:

RXTX
SerialInputStream(serial.getInputStream()调用返回的结果)支持一种超时方案,该方案最终解决了我所有的问题。在创建新的SerialReader对象之前添加以下内容将导致读取不再无限期地阻塞:

serial.enableReceiveTimeout(1000);

在SerialReader对象中,我不得不更改一些内容以直接从InputStream读取而不是创建ReadableByteChannel,但是现在,我可以停止并重新启动阅读器而不会出现问题。



 类似资料:
  • 我正在编写一个有3个线程的程序。一个读取一个文本文件并将单词输入到大小为2的ArraylistBlockingQueue中。下一个获取该列表并反转其中的每个其他单词。最后一个线程获取单词并将它们写入一个新的文本文件。 我所有的东西都在工作,除了我不知道如何中断和停止我的线程。程序写入文本文件,但从未结束。 主要方法 输入 反向类@重写公共void run(){ 输出代码@覆盖公共无效run(){

  • 问题内容: 我需要使用逐行读取文件,但是没有像一次读取一个完整行的方法。有什么解决方案? 问题答案: NIO通常用于直接内存访问或块介导的批量数据传输。它可以做其他事情,但是其他功能与阻塞和非阻塞数据访问有更多关系。 因此,您可能想使用NIO来快速(或以非阻塞方式)获取数据。但是,如果要“逐行读取”,最好在NIO读取可用数据后进行行检测。可以通过在NIO刚刚读取的缓冲区上放置“行读取”外观来轻松实

  • 编辑: 主要问题:为什么只有一个线程抛出interruptedexception,而两个线程都阻塞在条件上。await 所以下面的代码只是我创建的一个示例。主要的问题是开发一个生产者-消费者实现,在这个实现中,我必须创建一个模拟类,它产生两种线程:客户线程和厨师线程,这两种线程是基于可重入锁进行同步的。在执行一些操作(客户添加订单,厨师执行服务这些订单)后,我调用客户线程上的join以确保所有订单

  • 问题内容: 我正在使用子流程模块来启动子流程并连接到其输出流(标准输出)。我希望能够在其标准输出上执行非阻塞读取。有没有一种方法可以使.readline无阻塞或在调用之前检查流中是否有数据?我希望这是可移植的,或者至少要在Windows和Linux下工作。 这是我目前的操作方式(如果没有可用数据,它将阻塞): 问题答案: ,,不会在这种情况下帮助。 不管使用什么操作系统,一种可靠地读取流而不阻塞的

  • 问题内容: 我实际上尝试在600毫秒的时间内完成上述操作,此后它不应允许读取,但bufferedreader的readline阻塞了。请帮助 问题答案: 您可以使用BufferedReader.available()> 0检查是否有要读取的字符。

  • 问题内容: 就像标题所说的那样,我需要一种方法来停止或中断正在等待套接字输入的阻塞线程。 问题答案: Thread.interrupt()应该是您要寻找的方法。确保您的输入访问方法也检查InterruptedException和ClosedByInterruptException。 另请参阅Sun Concurrency Tutorial 中的相应页面,作为另一种解决方案的建议。