当前位置: 首页 > news >正文

java并发:管道流(Piped Streams)的应用场景

管道流(Piped Streams)是Java中用于线程间通信的特殊I/O流,它们通过创建"生产-消费"通道实现数据传输。

核心组件

image

 

连接方式

方式1:通过构造函数连接(推荐)

// 创建时直接连接
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream(pos); // 建立连接// 或者反向连接
PipedInputStream pis2 = new PipedInputStream();
PipedOutputStream pos2 = new PipedOutputStream(pis2);

 

方式2:通过 connect() 方法连接

PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader();// 显式建立连接(必须在读写前调用)
reader.connect(writer); 
// 或 writer.connect(reader);// 现在可以安全使用
writer.write("Data");
char[] buf = new char[4];
reader.read(buf); // 读取 "Data"

 

连接机制底层原理

管道流的连接在JVM层创建了一个循环缓冲区

graph LRProducer[生产者线程] -->|写入数据| Buffer[循环缓冲区]Buffer -->|读取数据| Consumer[消费者线程]

 

典型应用场景

(1)线程间数据流传递

当两个线程需要顺序处理数据流时,管道流可替代共享变量:

public class PipeConnectionDemo {public static void main(String[] args) throws IOException {// 创建未连接的流PipedWriter writer = new PipedWriter();PipedReader reader = new PipedReader();// 显式建立连接(关键步骤)
        writer.connect(reader); Thread producer = new Thread(() -> {try {writer.write("Hello Pipes!");writer.close(); // 关闭流通知结束} catch (IOException e) {e.printStackTrace();}});Thread consumer = new Thread(() -> {try {int charRead;while ((charRead = reader.read()) != -1) {System.out.print((char) charRead);}} catch (IOException e) {e.printStackTrace();}});producer.start();consumer.start();}
}

特点:

避免显式同步,通过流阻塞机制自然协调生产消费节奏

 

(2)自定义过滤器链

public class FilterChain {public static void main(String[] args) throws IOException {PipedWriter source = new PipedWriter();PipedReader sink = new PipedReader();// 创建处理链:A → B → CFilter filterA = new Filter(source, new PipedWriter());Filter filterB = new Filter(filterA.getOutputReader(), new PipedWriter());Filter filterC = new Filter(filterB.getOutputReader(), sink);// 启动过滤器线程
        filterA.start();filterB.start();filterC.start();// 写入原始数据source.write("Original data");source.close();// 从sink读取最终结果
        System.out.println(sink.read());}
}class Filter extends Thread {private final PipedReader in;private final PipedWriter out;public Filter(PipedReader in, PipedWriter out) {this.in = in;this.out = out;}@Overridepublic void run() {try {int c;while ((c = in.read()) != -1) {out.write(transform((char) c)); // 自定义转换逻辑
            }out.close();} catch (IOException e) { e.printStackTrace(); }}private char transform(char c) { ... } // 过滤逻辑
}

 

多管道连接模式

一对多广播

// 主生产者
PipedOutputStream mainOutput = new PipedOutputStream();// 创建多个消费者管道
PipedInputStream consumer1 = new PipedInputStream(mainOutput);
PipedInputStream consumer2 = new PipedInputStream(mainOutput);// 生产者写入的数据会被所有消费者读取
mainOutput.write("Broadcast".getBytes());

备注:实际应用中需考虑线程安全,建议配合BroadcastStream自定义实现

注意事项

必须显式连接:通过构造函数或connect()方法建立管道

缓冲区大小:默认1024字节,可通过PipedInputStream(int)构造函数调整

资源管理:使用try-with-resources确保关闭

try (PipedOutputStream pos = new PipedOutputStream();PipedInputStream pis = new PipedInputStream(pos)) {// 自动关闭双向流
}

 

总结

Java管道流的显式连接机制(构造函数或connect())是线程间流式通信的基础。

在多线程场景中,务必在启动线程前完成连接,并通过资源管理确保可靠关闭。

http://www.jsqmd.com/news/359098/

相关文章:

  • 【计算机毕业设计案例】基于springboot+vue的微信小程序的智慧校园平台基于springboot+小程序的高校校园信息交流平台小程序设计与实现(程序+文档+讲解+定制)
  • (100分)- 二元组个数(Java JS Python)
  • 计算机小程序毕设实战-基于SpringBoot中小学家校通系统的设计与实现springboot+小程序的家校通程序设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • ubuntu启用ssh (广域网访问)(IPV6访问)
  • 要不然让ai研究原神的界面也行,比如写个skill文件按下某个按键会进入什么界面,不给坐标,搞个程序识别按钮给个固定标签
  • (100分)- 等和子数组最小和(Java JS Python)
  • 【课程设计/毕业设计】基于微信小程序的校园信息交流平台基于springboot+小程序的高校校园信息交流平台小程序设计与实现【附源码、数据库、万字文档】
  • 内网共享神器,手机电脑一键互传大文件
  • (100分)- 端口合并(Java JS Python)
  • 【课程设计/毕业设计】基于springboot+小程序的家校通程序设计与实现消息推送、班级管理、作业管理、考勤管理、成绩管理【附源码、数据库、万字文档】
  • (100分)- 单词倒序(Java JS Python)
  • 小程序毕设项目:基于springboot+小程序的高校校园信息交流平台小程序设计与实现(源码+文档,讲解、调试运行,定制等)
  • 小程序毕设项目:基于springboot+小程序的家校通程序设计与实现(源码+文档,讲解、调试运行,定制等)
  • (100分)- 单向链表中间节点(Java JS Python)
  • (100分)- 打印机队列(Java JS Python)
  • 创业三年,记录来时路
  • jwt和oauth2的原理、特点、区别及使用场景
  • 计算机小程序毕设实战-基于springboot+小程序的高校生活互助平台小程序基于SpringBoot的高校报修与互助平台小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 戴尔服务器常用设置
  • 如何在 Teams 中添加一个页面
  • 【课程设计/毕业设计】基于SpringBoot校园生活服务小程序基于springboot+小程序的高校生活互助平台小程序【附源码、数据库、万字文档】
  • STC15F204EA概述
  • 对于tarjan的思考
  • 小程序毕设项目:基于springboot+小程序的高校生活互助平台小程序(源码+文档,讲解、调试运行,定制等)
  • Python快速入门——学习笔记(持续更新中~)
  • 2月8日-(OpenSpec规范)
  • 《深入理解Java虚拟机》| 运行时数据区与OOM异常
  • 小程序计算机毕设之基于springboot+小程序的高校生活互助平台小程序基于SpringBoot校园生活服务小程序(完整前后端代码+说明文档+LW,调试定制等)
  • 【毕业设计】基于springboot+小程序的高校生活互助平台小程序(源码+文档+远程调试,全bao定制等)
  • Kconfig测试