博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java使用PipedStream管道流通信
阅读量:6947 次
发布时间:2019-06-27

本文共 3019 字,大约阅读时间需要 10 分钟。

多线程使用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 = 0Get Data = 1Get Data = 2Get Data = 3Get Data = 4Get Data = 5Get Data = 6Get Data = 7

转载于:https://www.cnblogs.com/zhoutao825638/p/10393212.html

你可能感兴趣的文章
MQTT 客户端源码分析
查看>>
IT思想类智力题
查看>>
php设计模式-单例模式
查看>>
php扩展php-redis安装与使用
查看>>
python一天一题(2)
查看>>
Win10下安装Ubuntu16.04虚拟机并搭建TensorFlow1.3环境
查看>>
leetcode 108. Convert Sorted Array to Binary Search Tree
查看>>
【商城购物车】购物车逻辑
查看>>
PCIE协议解析 synopsys IP loopback 读书笔记(1)
查看>>
创建maven工程的时候卡死的解决办法
查看>>
Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
查看>>
微信小程序保存图片功能实现
查看>>
【Shiro】小读Shiro Filter(未完待续)
查看>>
Android环信即时通讯集成坑爹 注册报错208解决
查看>>
Flink及主流流框架spark,storm比较
查看>>
mysql按位的索引判断位的值
查看>>
一套简约漂亮的响应式博客园主题皮肤
查看>>
js获取时间戳
查看>>
Java数据结构和算法(四):栈
查看>>
为什么我的mac插入耳机耳机没有声音呢?
查看>>