java读pipe_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值