Java管道流实现线程间通信过程解析

 更新时间:2020年03月20日 11:28:18   作者:lkc9  
这篇文章主要介绍了Java管道流实现线程间通信过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

管道流

在Java语言中提供了各种各样的输入/输出流 Stream ,使我们能够很方便地对数据进行操作,其中管道流是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道流,另一个线程从输入管道流中读取数据。

通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。

字节流

PipedInputStream 和 PipedOutputStream

字符流

PipedReader 和 PipedWriter

示例

public class PipeStreamTest {
  public static void main(String[] args) throws IOException, InterruptedException {
    WriteData writeData = new WriteData();
    ReadData readData = new ReadData();

    PipedReader reader = new PipedReader();
    PipedWriter writer = new PipedWriter();

    writer.connect(reader);

    new Thread(() -> {
      writeData.writeMethod(writer);
    }).start();

    Thread.sleep(2000);

    new Thread(() -> {
      readData.readMethod(reader);
    }).start();
  }

  static class WriteData {
    public void writeMethod(PipedWriter writer) {
      try {
        System.out.println("write :");
        for (int i = 0; i < 300; i++) {
          String outData = "" + (i + 1);
          writer.write(outData);
          System.out.print(outData);
        }
        System.out.println();
        writer.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  static class ReadData {
    public void readMethod(PipedReader reader) {
      try {
        System.out.println("read :");
        char[] byteArray = new char[20];
        int readLength = reader.read(byteArray);
        while (readLength != -1) {
          String newData = new String(byteArray, 0, readLength);
          System.out.print(newData);
          readLength = reader.read(byteArray);
        }
        System.out.println();
        reader.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

运行结果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 关于springboot 配置date字段返回时间戳的问题

    关于springboot 配置date字段返回时间戳的问题

    这篇文章主要介绍了springboot 配置date字段返回时间戳的问题,在springboot2.0后,spring会将Date字段自动给转成UTC字符串了(在没有配置的情况下),所以date需要转换成时间戳还是yyyy-MM-dd HH:mm:ss,具体解决方法跟随小编一起看看吧
    2021-07-07
  • postman中实现传递@RequestBody参数

    postman中实现传递@RequestBody参数

    这篇文章主要介绍了postman中实现传递@RequestBody参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 关于Spring Boot对jdbc的支持问题

    关于Spring Boot对jdbc的支持问题

    这篇文章主要介绍了关于Spring Boot对jdbc的支持问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • SpringBoot集成geodesy实现距离计算功能

    SpringBoot集成geodesy实现距离计算功能

    Geodesy:大地测量学的神奇力量 Geodesy,又称大地测量学,是一门研究地球形状、大小及其重力场的学科,在地球距离计算中,它扮演着至关重要的角色,故本文给大家介绍了SpringBoot集成geodesy实现距离计算功能,感兴趣的朋友可以参考下
    2024-06-06
  • 详解Java合并数组的两种实现方式

    详解Java合并数组的两种实现方式

    这篇文章主要介绍了Java合并数组的两种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Spring Boot + thymeleaf 实现文件上传下载功能

    Spring Boot + thymeleaf 实现文件上传下载功能

    最近同事问我有没有有关于技术的电子书,我打开电脑上的小书库,但是邮件发给他太大了,公司又禁止用文件夹共享,于是花半天时间写了个小的文件上传程序,部署在自己的Linux机器上,需要的朋友可以参考下
    2018-01-01
  • Java基础之Integer使用的注意事项及面试题

    Java基础之Integer使用的注意事项及面试题

    这篇文章主要给大家介绍了关于Java基础之Integer使用注意事项及面试题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • java8的stream如何取max

    java8的stream如何取max

    这篇文章主要介绍了java8的stream如何取max问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java启动参数(-, -X, -XX参数)的使用

    Java启动参数(-, -X, -XX参数)的使用

    本文主要介绍了Java启动参数(-, -X, -XX参数)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java 线程创建多线程详解

    java 线程创建多线程详解

    本文主要讲解java 线程创建多线程的知识,这里对java线程的创建做了详细介绍,并附简单示例代码,有兴趣的小伙伴可以参考下
    2016-09-09

最新评论