zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    ubuntu12.04.2上利用cmake安装opencv2.4.6
    微软无线鼠标3500滚轮问题
    Linux 安装 Tomcat
    Linux 安装 MySQL
    Linux 安装 JDK
    Linux 安装 Redis 及踩坑
    IDEA Git 撤销push(回退到指定版本)
    【Java】Ajax实现级联城市
    node.js更换镜像源
    【Java】数据库连接池的简单使用
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947014.html
Copyright © 2011-2022 走看看