ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 线程中断没有结束阻塞调用输入流读取

2019-10-06 19:03:05  阅读:263  来源: 互联网

标签:java multithreading channel nonblocking rxtx


我正在使用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(缓冲)调用.代码如下:

public void stop() {
  t.interrupt();
  serial.close();
}

但是,当我运行此代码时,我从未得到ClosedByInterruptException,一旦输入流关闭,它应该触发.此外,执行阻止调用serial.close() – 因为底层输入流仍然在读取调用上阻塞.我已经尝试用byteChan.close()替换中断调用,然后应该导致AsynchronousCloseException,但是,我得到了相同的结果.

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

解决方法:

您不能简单地通过包装它来将不支持可中断I / O的流创建到InterruptibleChannel中(并且,无论如何,ReadableByteChannel不会扩展InterruptibleChannel).

您必须查看基础InputStream的合约. SerialPort.getInputStream()对其结果的可中断性有何评价?如果它没有说什么,你应该假设它忽略了中断.

对于任何未明确支持可中断性的I / O,唯一的选择通常是从另一个线程关闭流.这可能会立即引发在调用流时阻塞的线程中的IOException(尽管它可能不是AsynchronousCloseException).

但是,即使这非常依赖于InputStream的实现 – 底层操作系统也是一个因素.

请注意newChannel()返回的ReadableByteChannelImpl类的源代码注释:

  private static class ReadableByteChannelImpl
    extends AbstractInterruptibleChannel       // Not really interruptible
    implements ReadableByteChannel
  {
    InputStream in;
    ⋮

标签:java,multithreading,channel,nonblocking,rxtx
来源: https://codeday.me/bug/20191006/1861802.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有