当前位置:

首页 > 编程开发 > 如何同时读取多个输入流并执行其他任务

如何同时读取多个输入流并执行其他任务

Java中并发读取多个输入流需为每个流分配独立守护线程,配合BufferedReader.lines()的惰性流特性与try-with-resources管理资源,避免单线程阻塞导致程序卡死。注意设置守护线程、避免forEach内耗时操作,并确保流关闭时机。

本文讨论的是Ja va中一个很实际的问题:如何并发读取多个InputStream(比如命令输出流和数据流),避免单线程阻塞导致程序卡死或后续逻辑无法执行。核心思路是为每个输入流分配独立线程,配合BufferedReader.lines()的惰性流特性,再加上合理的资源管理。

在Ja va开发中,同时读取多个输入流(例如外部进程的输出流、数据流)是一个常见场景,但单线程顺序处理往往就栽在一个看似不起眼的坑里:BufferedReader.lines()返回的是一个惰性求值的Stream,它会一直等待新行输入,直到源流关闭或抛出异常。换句话说,如果你用br.lines().forEach(...)串行处理多个阻塞流,第一个流没读完、没关闭,后面的代码就永远跑不到——这正是那句“this never runs”永不执行的根本原因。单线程一条路走到黑,肯定不行,必须引入并发机制。

✅ 正确的做法:为每个输入流启动独立的守护线程,实现非阻塞、并行读取。下面是一段典型的实现:

// 启动线程1:监听 cmdsin
Thread cmdThread = new Thread(() -> {
    try (InputStreamReader isr = new InputStreamReader(cmdsin, StandardCharsets.UTF_8);
         BufferedReader br = new BufferedReader(isr)) {
        br.lines().forEach(line -> System.out.println("CMD: " + line));
    } catch (IOException e) {
        System.err.println("CMD stream error: " + e.getMessage());
    }
}, "CmdReader");
cmdThread.setDaemon(true); // 避免JVM因该线程挂起
cmdThread.start();

// 启动线程2:监听 datain
Thread dataThread = new Thread(() -> {
    try (InputStreamReader isr2 = new InputStreamReader(datain, StandardCharsets.UTF_8);
         BufferedReader br2 = new BufferedReader(isr2)) {
        br2.lines().forEach(line -> System.out.println("DATA: " + line));
    } catch (IOException e) {
        System.err.println("DATA stream error: " + e.getMessage());
    }
}, "DataReader");
dataThread.setDaemon(true);
dataThread.start();

// 主线程可自由执行其他逻辑(如定时任务、状态检查、用户交互等)
while (!Thread.interrupted()) {
    System.out.println("Main thread is running... (e.g., health check, config reload)");
    Thread.sleep(2000);
}

⚠️ 关键的几个注意事项:

  • 务必使用 try-with-resources:这样才能确保 InputStreamReader 和 BufferedReader 在流结束或异常时自动关闭,防止资源泄漏。
  • 设置为守护线程(setDaemon(true)):让子线程不阻止JVM退出;如果你需要保证流处理完成再退出,那就改用 join() 来协调生命周期。
  • 避免在 forEach 中执行耗时操作:lines().forEach(...) 内部仍然是同步调用。如果追求高吞吐,可以考虑改用 lines().parallel().forEach(...)(注意线程安全问题),或者用 lines().forEachOrdered(...) 保持顺序。
  • 流关闭时机决定读取何时终止:lines() 只有在底层 readLine() 返回 null(即流关闭)时才结束。如果上游程序没显式关闭流(比如进程没退出),线程就会一直等下去——这时候就需要配合超时机制或外部信号来中断。

? 进阶建议:如果遇上更复杂的 I/O 调度场景(比如动态增删流、背压控制),可以考虑 NIO.2 的 AsynchronousFileChannel 或者反应式库(像 Project Reactor 的 Flux.fromInputStream)。但对于标准 Process.getInputStream() 这类阻塞流,多线程方案依然是最简洁可靠的选择。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
多个网络账号向蔚来公开道歉 赔偿款将用于公益事业
多个网络账号向蔚来公开道歉 赔偿款将用于公益事业

多个网络账号因散布蔚来不实信息,被法院判决公开道歉并赔偿经济损失。蔚来承诺将所有赔偿款定向捐赠至教育、养老等公益项目,践行社会责任。

多个PDF文件怎么免费合并?极轻PDF在线合并方法
多个PDF文件怎么免费合并?极轻PDF在线合并方法

多个PDF文件可通过极轻PDF、Sejda或PDF24Tools在线免费合并。上传前需按顺序编号,合并后必须检查总页数、文件顺序及衔接页是否完整,确保无漏页或重复。建议逐页预览,避免内容错乱。它们完全免费,操作简单快捷,无需安装任何软件。

多个PDF怎么合并?PDF文件如何在线合并?
多个PDF怎么合并?PDF文件如何在线合并?

多个PDF文件可通过极轻PDF、Smallpdf、iLovePDF等在线工具合并。上传前需确认文件完好、命名清晰,调整顺序后合并。下载后重点检查总页数、页序和页面清晰度,确保文件完整无错乱。建议合并前检查文件是否加密或损坏,合并后预览每页内容。

PDF合并怎么按顺序排页码?多个PDF合并后如何检查页面?
PDF合并怎么按顺序排页码?多个PDF合并后如何检查页面?

将多个PDF合并前需按顺序重命名文件,上传后核对列表顺序,合并后检查总页数、衔接位置、页面方向及有无重复或颠倒。极轻PDF、iLovePDF、CleverPDF等工具支持拖拽调整顺序,可辅助完成合并和检查。

多个PDF文件怎么合并成一个?PDF文档如何在线合并?
多个PDF文件怎么合并成一个?PDF文档如何在线合并?

本文介绍三种在线合并PDF的方法:极轻PDF、小PDF和爱PDF。支持一次性上传多个文件,可按自定义顺序合并。完成后下载并检查总页数、页序及清晰度,确保内容连续、页码编号正确。操作简便,无需注册,适合批量处理,安全可靠,且免费易用。

哪些软件可以免费合并PDF?多个PDF在线合并怎么操作?
哪些软件可以免费合并PDF?多个PDF在线合并怎么操作?

在线合并PDF只需三步:上传文件、核对顺序、点击下载。整个过程免费,但需注意文件大小和数量限制,建议分批合并并检查页面衔接,确保顺序无误,避免出错。

Mac怎么把多个图片合成一个PDF
Mac怎么把多个图片合成一个PDF

Mac系统自带了一些方便的工具,能在30秒内把多张图片按顺序合成PDF哦!其中,访达右键“快速操作→创建PDF”这个方法是最快的,只需要3秒就能完成;预览拖拽缩略图调序则最灵活,可以随意调整图片顺序;打印窗口导出呢,支持高质量设置,能满足一些对PDF质量有要求的用户。在Mac上,如果您手头有十几张活

多个PDF文件怎么合并成一个?PDF文档在线合并要怎么操作?
多个PDF文件怎么合并成一个?PDF文档在线合并要怎么操作?

像分项报告、证明材料、课件这类文件,如果零散地分布在几个PDF里,其实完全可以按照你设定的顺序合并成一个文件。这样一来,不管是自己查阅、发给别人,还是后续归档保存,都会省事不少。下面整理了3种完整的操作方法,而且每一步都配好了对应的操作图。 方法一:用极轻PDF合并多个PDF极轻PDF(pdf.cn

多个PDF怎么合并成一个?PDF文件在线合并要怎么操作?
多个PDF怎么合并成一个?PDF文件在线合并要怎么操作?

日常处理资料时,常常会遇到这种情况:合同、报告、扫描件分散在不同文件里,最后却需要整理成一份完整的PDF。其实,用在线工具就能按自己的顺序把它们快速合并好。下面就用两种常见方法来说明,分别是极轻PDF(pdf.cn)和 iLovePDF,而且都会从操作开始一直讲到下载完成为止。 方法一:用极轻PDF

长PDF怎么拆分成多个文件?PDF拆分后如何下载?
长PDF怎么拆分成多个文件?PDF拆分后如何下载?

要是遇到那种页数超多的长PDF文件,直接用极轻PDF(pdf.cn)按照选好的页码范围来拆分就可以啦。不过动手之前,得先把自己想要保留的页面捋清楚哦,拆分完了以后,还得挨个检查一下生成的新文件,免得之前页码设置出了错呢。 在线拆分长PDF文档 步骤一:进入拆分PDF工具 首先,打开网站的首页。接着,

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Adobe Acrobat Pro macOS版
Adobe Acrobat Pro macOS版
Mac

Adobe Acrobat Pro 是面向办公、法务、财务、教育及出版用户的专业PDF处理软件,可在Mac上创建、编辑、转换、合并和保护文档,并提供OCR文字识别、表单、批注、内容比较、敏感信息遮盖及电子签名功能。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

WINDOWS 更多
AutoCAD Windows版
AutoCAD Windows版
Windows

AutoCAD 是 Autodesk 推出的专业计算机辅助设计软件,Windows 版支持精确二维绘图、三维实体与曲面建模、图纸标注、布局发布和任务自动化,并包含多套行业专业化工具组合,适用于建筑、机械、电气、工程建设及制造设计人员。

Adobe Acrobat Pro Windows版
Adobe Acrobat Pro Windows版
Windows

Adobe Acrobat Pro 是面向专业 PDF 工作的综合解决方案,可在 Windows 中创建、编辑、转换、比较、整理和保护文档,并支持表单、电子签名、扫描件文字识别及敏感信息永久遮盖。订阅还包含网页、移动服务和云端协作能力,

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。