使用管道流构建线程信息通道 | 带你学《Java语言高级特性》之六十二

简介: 在之前学习的几种IO流中不难发现,它们在面对线程间通信问题的时候显然无法实现IO操作,这时需要用到本节介绍的管道流来进行处理。

上一篇:运用内存操作流实现IO操作 | 带你学《Java语言高级特性》之六十一
在之前学习的几种IO流中不难发现,它们在面对线程间通信问题的时候显然无法实现IO操作,这时需要用到本节介绍的管道流来进行处理。

【本节目标】
通过阅读本节内容,你将了解到几种管道流实现类的继承关系及其相关方法的功能,并结合实例代码实现线程间的数据通信工作。

管道流

管道流主要功能是实现两个线程之间的IO处理操作。

image.png
管道流

对于管道流也分为两类:

字节管道流:PipedOutputStream、PipedInputStream
  |- 连接处理:public void connect(PipedInputStream snk) throws IOException;
字符管道流:PipedWriter、PipedReader
  |- 连接处理:public void connect(PipedReader snk) throws IOException;

image.png
PipedOutputStream
image.png
PipedInputStream
image.png
PipedWriter
image.png
PipedReader

范例:实现管道操作

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
 class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        SendThread send=new SendThread();
        ReceiveThread receive=new ReceiveThread();
        send.getOutput().connect(receive.getInput());//进行管道连接
        new Thread(send,"消息发送线程").start();
        new Thread(receive,"消息接收线程").start();
    }
}
class SendThread implements Runnable{
    private PipedOutputStream output;  //管道输出流

    public SendThread() {
        this.output = new PipedOutputStream();  //实例化管道输出流
    }
    @Override
    public void run() {
        try {    //利用管道实现数据的发送处理
             this.output.write(("【信息发送 - "+Thread.currentThread().getName()+"】www.mldn.cn\n").getBytes());
        }catch (IOException e){
             e.printStackTrace();
        }
        try {
            this.output.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    public PipedOutputStream getOutput(){
        return output;
    }
}
class ReceiveThread implements Runnable{
    private PipedInputStream input;

    public ReceiveThread() {
        this.input = new PipedInputStream();
    }
    @Override
    public void run() {
          byte[] data = new byte[1024];
          int len = 0;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();//所有的数据保存到内存输出流
        try {
             while ((len = input.read(data)) != -1) {
                bos.write(data, 0, len);  //所有的数据保存在内存流里面
            }
            System.out.println("{" +Thread.currentThread().getName()+"接收消息}\n"+ new String(bos.toByteArray()));
            bos.close();
         } catch (IOException e) {
              e.printStackTrace();
         } 
         try {
            this.input.close();
         } catch (IOException e) {
              e.printStackTrace();
         } 
    }
    public PipedInputStream getInput() {
        return input;
    }
}

执行结果:
{消息接收线程接收消息}【信息发送 - 消息发送线程】www.mldn.cn

管道就类似于在医院打点滴的效果,一个负责发送,一个负责接收,中间靠一个管道连接。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:“一目十行”的RandomAccessFile类 | 带你学《Java语言高级特性》之六十三
更多Java面向对象编程文章查看此处

相关文章
|
9天前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
171 1
|
12天前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
317 1
|
13天前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
143 12
|
18天前
|
安全 Java API
使用 Java 构建强大的 REST API 的四个基本技巧
本文结合探险领域案例,分享Java构建REST API的四大核心策略:统一资源命名、版本控制与自动化文档、安全防护及标准化异常处理,助力开发者打造易用、可维护、安全可靠的稳健API服务。
100 2
|
2月前
|
数据采集 搜索推荐 Java
Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与用户体验优化中的应用(221)
本文探讨 Java 大数据在智能教育虚拟学习环境中的应用,涵盖多源数据采集、个性化推荐、实时互动优化等核心技术,结合实际案例分析其在提升学习体验与教学质量中的成效,并展望未来发展方向与技术挑战。
|
3月前
|
消息中间件 监控 Java
借助最新技术构建 Java 邮件发送功能的详细流程与核心要点分享 Java 邮件发送功能
本文介绍了如何使用Spring Boot 3、Jakarta Mail、MailHog及响应式编程技术构建高效的Java邮件发送系统,涵盖环境搭建、异步发送、模板渲染、测试与生产配置,以及性能优化方案,助你实现现代化邮件功能。
148 0
|
3月前
|
NoSQL Java 数据库
Java 全栈学习超全面知识图谱构建完整 Java 知识体系
本文全面讲解Java核心技术体系,涵盖基础语法、面向对象、集合框架、主流框架(Spring、Spring Boot、MyBatis)及三大实战项目(微服务电商、响应式博客、企业后台系统),助你系统掌握Java全栈开发技能。
232 1
|
3月前
|
Java Shell Maven
【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。
|
3月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
76 0
|
3月前
|
JSON JavaScript 前端开发
Python+JAVA+PHP语言,苏宁商品详情API
调用苏宁商品详情API,可通过HTTP/HTTPS发送请求并解析响应数据,支持多种编程语言,如JavaScript、Java、PHP、C#、Ruby等。核心步骤包括构造请求URL、发送GET/POST请求及解析JSON/XML响应。不同语言示例展示了如何获取商品名称与价格等信息,实际使用时请参考苏宁开放平台最新文档以确保兼容性。