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

2023-11-27

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

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


你不能将不支持可中断 I/O 的流制作成InterruptibleChannel只需将其包裹起来(无论如何,ReadableByteChannel不延伸InterruptibleChannel).

你必须看底层的合约InputStream。什么是SerialPort.getInputStream()说说它的结果的可中断性?如果它什么也没说,你应该假设它忽略了中断。

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

然而,即便如此,这也极大地依赖于该协议的实施。InputStream——底层操作系统也可能是一个因素。


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

  private static class ReadableByteChannelImpl
    extends AbstractInterruptibleChannel       // Not really interruptible
    implements ReadableByteChannel
  {
    InputStream in;
    ⋮
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程中断未结束输入流读取上的阻塞调用 的相关文章

随机推荐

  • 是否有人在加载 Keras 保存的模型时遇到“AttributeError: 'str' object has no attribute 'decode'”

    训练后 我使用保存了 Keras 整个模型和仅权重 model save weights MODEL WEIGHTS and model save MODEL NAME 模型和重量已成功保存 没有错误 我可以简单地使用 model load
  • 为什么 Microsoft 不支持 OLE DB 连接到 SQL Azure?

    At the MSDN 网站它说 不支持使用 OLE DB 连接到 SQL Azure 网络上还有其他地方 人们报告在调整连接字符串中的服务器名称后 它对他们来说工作得很好 例如here and here 甚至 SQL Server 的An
  • Android 谷歌日历 API 在发布时不起作用

    我正在使用 google calendar api 从公共日历获取事件 在谷歌开发者控制台中 我创建了一个服务帐户密钥 json 我用它来在 android 代码中设置 GoogleCredential 如下所示 AssetManager
  • 使用 np.polyfit 在 3 维中拟合多项式

    我有一个数据数组 具有尺寸 N 3 对于某个整数N 指定 3D 空间中粒子的轨迹 即每个行条目都是 x y z 粒子的坐标 该轨迹平滑且简单 我希望能够对该数据拟合多项式 我可以用以下方法做到这一点 x y 坐标使用np polyfit i
  • 如何在 postgresql 中自动递增字母数字值?

    我在用 PostgreSQL 9 3 5 我有一个Table StackOverflowTable with columns SoId SoName SoDob 我想要一个Sequence generator对于列SoId这是一个字母数字值
  • UITableView 在 UIScrollView 内部时出现滚动问题

    我有一个 UIScrollView 带分页 我向其中添加了三个 UIView 每个 UIView 内部都有一个 UITableView 因此 用户应该能够水平滚动到他想要的页面 然后在相应的表格中垂直滚动 但是 某些表格不接收滚动手势 通常
  • 如何在具有跨平台兼容性的情况下强制 Git 提交中的行结尾一致

    在与使用不同操作系统的人一起工作时 我遇到了由于行结尾而导致的合并冲突问题 我在 Windows 上工作 我的同事在 Mac 上工作 当他推送更改时 有时他未处理的文件会在差异中显示为已更改 因为行结尾现在显示 M在每个文件上 这导致了合并
  • 使用 BeanDefinitionRegistryPostProcessor 创建 N 个 Bean

    我正在尝试创建N动态使用的bean数量BeanDefinitionRegistryPostProcessor 基于this问题 我选择使用BeanDefinitionRegistryPostProcessor对于我的用例 我在我的中定义了以
  • heroku 推送错误:“无法检测 rake 任务”

    我正在尝试部署一个基本应用程序 但它不起作用 使用 git push heroku master 我收到此错误消息 remote Could not detect rake tasks remote ensure you can run b
  • JPEG 字节顺序对编码有何影响?

    我目前正在做一个涉及图片的大项目 我遇到的大问题之一是图片的字节顺序 jpeg 更清楚 我一直认为在我们的现代世界中我们不必担心这个问题 但现在我不确定 我做什么 我向 IP 摄像机发出 HTTP 请求 摄像机返回给我一个字节数组 我使用以
  • 断言比较两个对象列表 C#

    我目前正在尝试学习如何使用单元测试 并且我已经创建了 3 个动物对象的实际列表和 3 个动物对象的预期列表 问题是如何断言检查列表是否相等 我尝试过 CollectionAssert AreEqual 和 Assert AreEqual 但
  • boost asio iostream - 如何获取本地IP地址

    这是我的问题 我正在使用 boost asio ip tcp iostream 连接到服务器 boost asio ip tcp iostream s IP 1237 现在我想检索我自己的本地 IP 地址 我在谷歌深处找到了如何使用sock
  • Mayavi 可以渲染透明背景的人物场景吗?

    我正在使用 mayavi mlab 生成网格图 并希望背景不透明度为 0 或透明 这可能吗 如果您的目标是将 mayavi 图集成到 matplotlib 图中 这是可能的 您可以使用mlab screenshot获取 RGBA 值的 nu
  • 如何使用CSS组合混合混合模式和隔离?

    我有一个带有红色背景的父元素 我想要一个 h2 元素将一些单词与背景混合 其他单词在 span 标签内 不 我下面的例子不起作用 如何让它发挥作用 bg red background red blend mix blend mode dif
  • 结束日期大于开始日期验证android

    我有两个 EditText 一个带有开始日期 另一个带有结束日期 我需要进行验证并检查结束日期是否大于开始日期 我不知道我该怎么做 在我的代码中 我以天为单位计算两个日期之间的差异 现在我还需要检查结束日期是否大于开始日期 这是我的代码 E
  • 构造函数中的 C++ 通用引用和返回值优化 (rvo)

    为什么在具有通用引用参数的构造函数的类中不会发生右值优化 http coliru stacked crooked com a 672f10c129fe29a0 include
  • 如何更改 Switch 小部件的大小

    在冰淇淋三明治中Switch引入了显示开关滑块的小部件 我像这样添加了开关
  • 防止 IIS 在任务结束之前终止该任务

    我正在构建一个日志库 将所有内容存储在 Azure 表上 写入该表显然需要很多时间 永远不会超过 1 秒 但仍然太多让用户等待 因此 Log 方法返回一个 LogResult 实例 这是该类 public class LogResult p
  • 在另一个 React 项目中使用一个 React 项目

    我想在另一个 React 项目中使用一个 React 项目 但我想更好地解释自己 我有一个 React 项目 我想在我的电脑上放置更多其他 React 项目 我不想将我的项目放在公共 npm 中 如何在更大的 React 项目中使用这些独立
  • 线程中断未结束输入流读取上的阻塞调用

    我正在使用 RXTX 从串行端口读取数据 读取是在按以下方式生成的线程中完成的 CommPortIdentifier portIdentifier CommPortIdentifier getPortIdentifier port Comm