Java使用PipedStream管道流通信

多线程使用PipedStream 通讯

Java 提供了四个相关的管道流,我们可以使用其在多线程进行数据传递,其分别是

类名 作用 备注
PipedInputStream 字节管道输入流 字节流
PipedOutputStream 字节管道输出流 字节流
PipedReader 字符管道读取 字符流
PipedWriter 字符管道写入 字符流

其分为两类:字节流和字符流,基本步骤为:线程A写入数据到输出流/写入,线程B读取数据从输入流/字符读取,从而实现线程通讯,下面我们先看下基于字节流的实现方法.

写数据到输出流

package com.zhoutao.demo.thread.piped;

import java.io.IOException;
import java.io.PipedOutputStream;
import java.util.concurrent.TimeUnit;

public class WriteData {

  private int count = 0;

  public void writeMethod(PipedOutputStream pipedOutputStream) throws InterruptedException, IOException {
    while (true) {
        // 每隔1s向输出流写入数字字符串
      pipedOutputStream.write(String.valueOf(count++).getBytes());
      TimeUnit.SECONDS.sleep(1);
    }
  }
}

读数据从输入流

package com.zhoutao.demo.thread.piped;

import java.io.IOException;
import java.io.PipedInputStream;

public class ReadData {

  public void readMethod(PipedInputStream inputStream) throws IOException {
    byte[] bytes = new byte[20];
    int read;
      // 当流中不存在数据时候,read方法会进入阻塞状态
    while ((read = inputStream.read(bytes)) != -1) {
      String newData = new String(bytes, 0, read);
      System.out.println("Get Data = " + newData);
    }
  }
}

启动测试

package com.zhoutao.demo.thread.piped;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class PipesStreamDemo {

  public static void main(String[] args) throws IOException {
    // 创建读写对象
    WriteData writeData = new WriteData();
    ReadData readData = new ReadData();

    // 创建管道输入输出流
    PipedInputStream pipedInputStream = new PipedInputStream();
    PipedOutputStream pipedOutputStream = new PipedOutputStream();

    // 重点:连接管道流
    pipedOutputStream.connect(pipedInputStream);

    // 创建对应的线程并启动
    ThreadRead threadRead = new ThreadRead(readData, pipedInputStream);
    ThreadWrite threadWrite = new ThreadWrite(writeData, pipedOutputStream);
    threadRead.start();
    threadWrite.start();

    // 观察控制台输出的数据
  }

  static class ThreadRead extends Thread {
    private ReadData readData;

    private PipedInputStream inputStream;

    public ThreadRead(ReadData readData, PipedInputStream inputStream) {
      this.readData = readData;
      this.inputStream = inputStream;
    }

    @Override
    public void run() {
      try {
        readData.readMethod(inputStream);
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  static class ThreadWrite extends Thread {
    private WriteData writeData;

    private PipedOutputStream pipedOutputStream;

    public ThreadWrite(WriteData writeData, PipedOutputStream pipedOutputStream) {
      this.writeData = writeData;
      this.pipedOutputStream = pipedOutputStream;
    }

    @Override
    public void run() {
      try {
        writeData.writeMethod(pipedOutputStream);
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

测试数据

Get Data = 0
Get Data = 1
Get Data = 2
Get Data = 3
Get Data = 4
Get Data = 5
Get Data = 6
Get Data = 7

原文地址:https://www.cnblogs.com/zhoutao825638/p/10393212.html

时间: 2024-08-29 09:36:14

Java使用PipedStream管道流通信的相关文章

java多线程通过管道流实现不同线程之间的通信

java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似临时文件之类的东西.jdk提供4个类来使线程建可以进行通信. (1)PipedInputStream与PipedOutputStream (2)PipedReader与PipedWriter (1)PipedInputStream与PipedOutputStream package com.ming

Java IO7:管道流、对象流

前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常见的流类.当然除了这些流类之外,Java还提供了很多的流类给用户使用,本文就看一下别的流. 管道流 管道流主要用于连接两个线程的通信.管道流也分为字节流(PipedInputStream.PipedOutputStream)和字符流(PipedReader.PipedWriter).比如一个Pipe

Java IO5:管道流、对象流

前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常见的流类.当然除了这些流类之外,Java还提供了很多的流类给用户使用,本文就看一下别的流. 管道流 管道流主要用于连接两个线程的通信.管道流也分为字节流(PipedInputStream.PipedOutputStream)和字符流(PipedReader.PipedWriter).比如一个Pipe

【Java】线程管道通讯

很多操作系统对于管道的吹嘘往往是天花龙凤, 好心点的就贴段伪代码给你看,为出书而出书的,就直接一堆概念堆在上面,让人根本看不懂, 如此简单的概念,明明几句话就解释清楚,有的书还专门开出一章来讨论这个问题,完全没有必要! 一.基本概念 其实管道的概念非常简单,就是连接两个线程通讯的缓冲区,画个图就更加明白了 写者进程把自己的数据通过管道输出流写入管道,读者进程再从管道通过管道输入流拿管道里面的数据 当然进程与进程之间传递数据未必通过这个方式去传递数据, 完全可以在一个进程中设置一个public变量

Java多线程-管道流实现线程间通信

管道流 在Java语言中提供了各种各样的输入/输出流 Stream ,使我们能够很方便地对数据进行操作,其中管道流是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道流,另一个线程从输入管道流中读取数据. 通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西. 字节流 PipedInputStream 和 PipedOutputStream 字符流 PipedReader 和 PipedWriter 示例: public class PipeStreamTe

java管道流PipedStream

管道流的主要作用是可以进行两个线程间的通信

java 多线程通信之管道流

/*   管道流: PipedInputStream void connect(PipedOutputStream src)  使此管道输入流连接到管道输出流 src PipedOutputStream void connect(PipedInputStream snk)   在JDK我们看到PipedInputStream中有管道缓冲区,用来接收数据 管道流内部在实现时还有大量的对同步数据的处理 管道输出流和管道输入流执行时不能互相阻塞,所以一般要开启独立线程分别执行 顺便复习了多线程操作 [

JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的

java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream

管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入流之上.如图所示: 1.管道输入流应该连接到管道输出流 ,输入流和输出流可以直接连接       2.使用多线程操作,结合线程进行操作.通常由某个线程从管道输入流中(PipedInputStream)对象读取.          并由其他线程将其写入到相应的端到输出流中.不能使用单线程