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
java中PipedStream管道流通信详细使用(详解)的更多相关文章
- JAVA中的四种JSON解析方式详解
JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...
- Java中的String,StringBuffer,StringBuilder详解与区别
1.String Java中string类是不可变的,其中在声明的源代码中用的final,所以只能声明一次.所以每次在明面上的改变其实是重新生成一个String对象,指针指向新的String对象.同时 ...
- java中String是对象还是类?详解java中的String
有很多人搞不懂对象和类的定义.比如说java中String到底是对象还是类呢? 有人说String 既可以说是类,也可以说是对象. 其实他这么说也没问题, 类和对象其实都是一个抽象的概念. 我们可以把 ...
- C++/Java中继承关系引发的调用关系详解
C++: 这里引用到了 http://blog.csdn.net/haoel/article/details/1948051/ 中的内容,还请提前阅读陈大神的这篇博客后在阅读本篇. 覆盖,实现多态的基 ...
- Java中的双重检查(Double-Check)详解
在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下所示: ? 1 2 3 4 5 6 7 8 9 10 public ...
- 线程:Java中wait、notify、notifyAll使用详解
基础知识 首先我们需要知道,这几个都是Object对象的方法.换言之,Java中所有的对象都有这些方法. public final native void notify(); public final ...
- Java中的宏变量,宏替换详解。
群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 首先来看下面这段程序,和群友分享的大致一样. public static void main(String[] args) { String ...
- JAVA中this的三种用法的详解
this关键字必须放在非静态方法里面 this关键字代表自身,在程序中主要的使用用途有以下几个方面: ? 使用this关键字引用成员变量 ? 使用this关键字在自身构造方法内部引用其它构造方法 ? ...
- JAVA中list,set,数组之间的转换详解
JAVA的list,set,数组之间的转换,主要是使用Apache Jakarta Commons Collections,具体的方法如下:import org.apache.commons.coll ...
随机推荐
- 一文带你了解Spring核心接口Ordered的实现及应用
前言 最近在看框架的时候,发现了这个接口,在此进行总结,希望能够给大家帮助,同时提升自己. order接口的大体介绍 Spring框架中有这个一个接口,名字叫Ordered,联想我们在数据库中应用的O ...
- 解决:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure(真实有效)
数据库连接失败 一.例如我在SpringBoot项目中使用了阿里的数据库连接池Driud. 有次在启动的时候,会报这样的错: Caused by: com.mysql.cj.exceptions.CJ ...
- java开发常见单词(复习整理)
开发中基本都能碰到,不止以下单词,后续会添加,javascript.html.mysql.spring.Linux中常用单词于此合并分类,特殊不常见不添加 访问修饰符4个--------------- ...
- 【转】46个Linux常用命令
转:https://www.cnblogs.com/passzhang/p/8552757.html 问题一: 绝对路径用什么符号表示?当前目录.上层目录用什么表示?主目录用什么表示? 切换目录用什么 ...
- select嵌套问题
关于sql语句: SELECT COUNT(ID) FROM dbo.N_Order_BusinessBatch WHERE Mobile='15210235082' And CreateTime=( ...
- python-修改文件
1.修改文件1 # fw = open('username','w')# fw.write('hhhh')# fw.flush() #强制把缓冲区里面的数据写到磁盘上1.简单粗暴直接# 1.打开一 ...
- PAT1027 Colors in Mars (20分) 10进制转13进制
题目 People in Mars represent the colors in their computers in a similar way as the Earth people. That ...
- MySQL数据库回表与索引
目录 回表的概念 1.stu_info表案例 2.查看刚刚建立的表结构 3.插入测试数据 4.分析过程 5.执行计划 回表的概念 先得出结论,根据下面的实验.如果我要获得['liu','25']这条记 ...
- python之Python内置函数一览表
Python 解释器自带的函数叫做内置函数,这些函数可以直接使用,不需要导入某个模块. 如果你熟悉 Shell 编程,了解什么是 Shell 内置命令,那么你也很容易理解什么是 Python 内置函数 ...
- css实现双色饼图
from:wx--前端早读课 首先回想用css画三角形的方法: <div class="triangle"></div> .triangle { displ ...