java线程间通信之通过管道进行通信
管道流PipeStream是一种特殊的流,用于在不同线程间直接传送数据,而不需要借助临时文件之类的东西。
jdk中提供了四个类来使线程间可以通信:
1)PipedInputStream和PipedOutputStream
2)PipedReader和PipedWriter
先看看字节流的示例:
public class ReadData {
public void readMethod(PipedInputStream in) throws IOException{
System.out.println("begin read...");
byte[] b = new byte[20];
int readLength = in.read(b);
while (readLength != -1) {
String newData = new String(b, 0, readLength);
System.out.println("read:"+newData);
readLength = in.read(b);
}
in.close();
System.out.println("end read...");
}
}
public class WriteData {
public void writeMethod(PipedOutputStream out) throws IOException{
System.out.println("begin write...");
for (int i = 0; i < 10; i++) {
out.write((""+i).getBytes());
System.out.println("write:"+i);
}
out.close();
System.out.println("end write...");
}
}
public class ThreadRead extends Thread {
private ReadData readData;
private PipedInputStream in;
public ThreadRead(ReadData readData, PipedInputStream in) {
this.readData = readData;
this.in = in;
}
@Override
public void run() {
try {
readData.readMethod(in);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ThreadWrite extends Thread {
private WriteData writeData;
private PipedOutputStream out;
public ThreadWrite(WriteData writeData, PipedOutputStream out) {
this.writeData = writeData;
this.out = out;
}
@Override
public void run() {
try {
writeData.writeMethod(out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Run {
public static void main(String[] args) throws IOException, InterruptedException {
WriteData writeData = new WriteData();
ReadData readData = new ReadData();
PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream();
in.connect(out);
new ThreadWrite(writeData, out).start();
Thread.sleep(2000);
new ThreadRead(readData, in).start();
}
}

再看看字符流示例:
public class ReadData {
public void readMethod(PipedReader reader) throws IOException{
System.out.println("begin read...");
char[] c = new char[20];
int readLength = reader.read(c);
while (readLength != -1) {
String newData = new String(c, 0, readLength);
System.out.println("read:"+newData);
readLength = reader.read(c);
}
reader.close();
System.out.println("end read...");
}
}
public class WriteData {
public void writeMethod(PipedWriter writer) throws IOException{
System.out.println("begin write...");
for (int i = 0; i < 10; i++) {
writer.write((""+i));
System.out.println("write:"+i);
}
writer.close();
System.out.println("end write...");
}
}
public class ThreadRead extends Thread {
private ReadData readData;
private PipedReader reader;
public ThreadRead(ReadData readData, PipedReader reader) {
this.readData = readData;
this.reader = reader;
}
@Override
public void run() {
try {
readData.readMethod(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ThreadWrite extends Thread {
private WriteData writeData;
private PipedWriter writer;
public ThreadWrite(WriteData writeData, PipedWriter writer) {
this.writeData = writeData;
this.writer = writer;
}
@Override
public void run() {
try {
writeData.writeMethod(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Run {
public static void main(String[] args) throws IOException, InterruptedException {
WriteData writeData = new WriteData();
ReadData readData = new ReadData();
PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader();
writer.connect(reader);
new ThreadWrite(writeData, writer).start();
Thread.sleep(2000);
new ThreadRead(readData, reader).start();
}
}

java线程间通信之通过管道进行通信的更多相关文章
- Java线程间通信-回调的实现方式
Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...
- 说说Java线程间通信
序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...
- 说说 Java 线程间通信
序言 正文 一.Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在一个 ...
- Java 线程间通讯(共享变量方式)
Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题. 一.没考虑线程同步: package com.wyf; publi ...
- Java 线程间通讯(管道流方式)
一.管道流是JAVA中线程通讯的常用方式之一,基本流程如下: 1)创建管道输出流PipedOutputStream pos和管道输入流PipedInputStream pis 2)将pos和pis匹配 ...
- Java线程间通信之wait/notify
Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.我们来看下相关定义: w ...
- java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- Java——线程间通信
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- java线程间通信1--简单实例
线程通信 一.线程间通信的条件 1.两个以上的线程访问同一块内存 2.线程同步,关键字 synchronized 二.线程间通信主要涉及的方法 wait(); ----> 用于阻塞进程 noti ...
随机推荐
- PDA(Windows Mobile)调用远程WebService
之前用模拟器测试过调用远程的WebService,发现总是提示"无法连接到远程服务器"的错误,不管是Windows Mobile6.0 还是6.5都是一样,按照网上的办法,改注册表 ...
- ANDROID框架结构和介绍
下图是ANDROID4.4 版本包含的所有系统服务.本地服务和应用的框架图,组织为三层:应用层.系统服务层.本地进程和服务层.应用层通常通过服务提供的对外API接口(一个服务管理对象)与服务交互,系统 ...
- How Tomcat Works读书笔记三-------连接器
几个概念 HttpServlet,Servlet Servlet是一个接口,定义了一种网络服务,我们所有的servlet都要实现它(或它的子类) HttpServlet是一个抽象类,它针对的就是htt ...
- Erlang Rebar 使用指南之一:入门篇
Erlang Rebar 使用指南之一:入门篇 全文目录: https://github.com/rebar/rebar/wiki 本章原文: https://github.com/rebar/reb ...
- web报表工具finereport常用函数的用法总结(数组函数)
ADD2ARRAY ADDARRAY(array,insertArray, start):在数组第start个位置插入insertArray中的所有元素,再返回该数组. 示例: ADDARRAY([3 ...
- SharePoint 2007 图片库视图不可用、页面标题不显示
描述: 问题1:SharePoint新建图片库,想选择"视图"-"所有图片",选择"详细信息.幻灯片.缩略图"等视图,均没有反应.如图1. ...
- miniUI input设置默认值,js获取年月注意事项,数据库nvl函数使用
2017-6-5周一,今天碰到的一个需求是:两税附征模块进入页面筛选时间默认值为当前月的上一个月,并根据筛选结果显示数据,我们用的框架为miniUI. 坑1: 默认值设置,刚刚接触miniUI,对里面 ...
- 2MySQL Server 系统架构
2.2MySQL Server 系统架构 总的来说,MySQL 可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限 ...
- Zookeeper简介和安装(二)
一.简介: Zookeeper是一个分布式协调服务,提供的服务如下: 命名服务:类似于DNS,但仅对于节点 配置管理:服务配置信息的管理 集群管理:Dubbo使用Zookeeper实现服务治理 分布式 ...
- JAVA 语法2
1.算术运算符 运算符 运算规则 范例 结果 + 正号 +3 3 + 加 2+3 5 + 连接字符串 "中"+"国" "中国" - 负号 i ...