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多线程通过管道流实现不同线程之间的通信
java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
- Java IO7:管道流、对象流
前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...
- Java IO5:管道流、对象流
前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...
- java io之管道流
一.java.io中存在一中流叫管道流,类似管道的功能.PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流.这个两个流必须同时使用. 二.作用:进行两个线 ...
- java多线程之管道流
java语言中提供了各种各样的流供我们操纵数据,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据. 一个线程发送数据到输出管道,另一个线程从输入管道读取数据,通过使用管道 ...
- 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream
目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...
- java中PipedStream管道流通信详细使用(详解)
多线程使用PipedStream 通讯 Java 提供了四个相关的管道流,我们可以使用其在多线程进行数据传递,其分别是 类名 作用 备注 PipedInputStream 字节管道输入流 字节流 Pi ...
- JAVA IO之管道流总结大全(转)
要在文本框中显示控制台输出,我们必须用某种方法“截取”控制台流.换句话说,我们要有一种高效地读取写入到System.out和 System.err 所有内容的方法.如果你熟悉Java的管道流Piped ...
- Java中的管道流 PipedOutputStream和PipedInputStream
我们在学习IO流的时候可能会学字节流.字符流等,但是关于管道流的相信大部分视频或者教程都是一语带过,第一个是因为这个东西在实际开发中用的也不是很多,但是学习无止境,存在既有理.JDK中既然有个类那说明 ...
随机推荐
- Wmyskxz文章目录导航附Java精品学习资料
前言:这段时间一直在准备校招的东西,所以一晃眼都好长时间没更新了,这段时间准备的稍微好那么一点点,还是觉得准备归准备,该有的学习节奏还是要有..趁着复习的空隙来整理整理自己写过的文章吧..好多加了微信 ...
- kubernetes实践之五:深入理解Service及内部DNS搭建
一.Service存在的意义: 防止Pod失联(服务发现) 定义一组Pod的访问策略(负载均衡) 支持ClusterIP,NodePort以及LoadBalancer三种类型 Service的底层实现 ...
- 详解synchronized与Lock的区别与使用
知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...
- oppo设备怎么样无需root激活XPOSED框架的教程
在非常多部门的引流或业务操作中,基本上都需要使用安卓的强大XPOSED框架,近期,我们部门购来了一批新的oppo设备,基本上都都是基于7.0以上版本,基本上都不能够获得root的su超级权限,即使一部 ...
- 浅析C语言中的整形类型
在C语言中,可以把 字符型.短整形.整形.长整形都看作是整形,同属于整形家族这个大类型. 这些类型的大小,默认是否有符号等一些知识点较零散,较容易混淆,所以特地整理如下. 一 类型存储字节长度说明 ...
- Ambari安装及自定义service初步实现
Ambari安装 1 Ambari简介 Apache Ambari项目的目的是通过开发软件来配置.监控和管理hadoop集群,以使hadoop的管理更加简单.同时,ambari也提供了一个基于它自身R ...
- 修改Android idc文件
安卓系统idc文件里面包含以下几点内容: 1 #=0 外部设备 =1内部设备 2 device.internal = 0 3 #定义:keyboard.layout = <name> 4 ...
- Chrome内核浏览器打开网页报 错误代码: ERR_TIMED_OUT
升级win10之后如果出现chrome内核的浏览器网页总是打不开 打开很慢 而ie和edge是可以正常访问的 用这个方法可以 我弄了几天终于 搞好了我直接转载过来了近期,工程师收到大量反馈360浏 ...
- asp.net core 2.0的认证和授权
在asp.net core中,微软提供了基于认证(Authentication)和授权(Authorization)的方式,来实现权限管理的,本篇博文,介绍基于固定角色的权限管理和自定义角色权限管理, ...
- 开放windows服务器端口-----以打开端口8080为例
[转载]原文地址:https://blog.csdn.net/spt_dream/article/details/75014619 本文记录两个内容: 1.win7下打开端口 2.服务器(2003或者 ...