在Java语言中提供了各种各样的输入/输出流Stream,使我们能够方便的对数据进行操作,其中管道流是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。

在Java的JDK中提供了4个类来使线程间可以进行通信:

  1)PipedInputStream和PipedOutputStream

  2)PipedReader和PipedWriter

1)PipedInputStream和PipedOutputStream

 package pipeInputOutput;

 import java.io.PipedOutputStream;

 public class WriteData {

     public void writeMethod(PipedOutputStream out) {
try {
System.out.println("write :");
for(int i=0; i<30000; i++) {
String outData = "" + (i+1);
out.write(outData.getBytes());
System.out.print(outData);
}
System.out.println();
out.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} }
 package pipeInputOutput;

 import java.io.PipedInputStream;

 public class ReadData {

     public void readMethod(PipedInputStream in) {
try {
byte[] byteArray = new byte[20];
int readLength = in.read(byteArray);
while(readLength != -1) {
System.out.print("read :");
String newData = new String(byteArray, 0, readLength);
System.out.println(newData);
readLength = in.read(byteArray);
}
System.out.println();
in.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} }
 package pipeInputOutput;

 import java.io.PipedOutputStream;

 public class ThreadWrite extends Thread {

     private WriteData write;
private PipedOutputStream out; public ThreadWrite(WriteData write, PipedOutputStream out) {
super();
this.write = write;
this.out = out;
} @Override
public void run() {
write.writeMethod(out);
} }
 package pipeInputOutput;

 import java.io.PipedInputStream;

 public class ThreadRead extends Thread {

     private ReadData read;
private PipedInputStream in; public ThreadRead(ReadData read, PipedInputStream in) {
super();
this.read = read;
this.in = in;
} @Override
public void run() {
read.readMethod(in);
} }
 package pipeInputOutput;

 import java.io.PipedInputStream;
import java.io.PipedOutputStream; public class Run { public static void main(String[] args) {
try {
WriteData writeData = new WriteData();
ReadData readData = new ReadData(); PipedInputStream inputStream = new PipedInputStream();
PipedOutputStream outputStream = new PipedOutputStream(); outputStream.connect(inputStream); // outputStream.write("hello world".getBytes());
// byte[] bs = new byte[100];
// int i = inputStream.read(bs);
// System.out.println(new String(bs,0,i)); ThreadRead threadRead = new ThreadRead(readData, inputStream);
threadRead.start(); Thread.sleep(2000); ThreadWrite threadWrite = new ThreadWrite(writeData, outputStream);
threadWrite.start();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} }

2)PipedReader和PipedWriter

 package pipeReaderWriter;

 import java.io.PipedWriter;

 public class WriteData {

     public void writeMethod(PipedWriter out) {
try {
System.out.println("write :");
for(int i=0; i<300; i++) {
String outData = "" + (i+1);
out.write(outData);
System.out.println(outData);
}
System.out.println();
out.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} }
 package pipeReaderWriter;

 import java.io.PipedReader;

 public class ReadData {

     public void readMethod(PipedReader in) {
try {
System.out.println("read:");
char[] byteArray = new char[20];
int readLength = in.read(byteArray);
while(readLength != -1) {
String newData = new String(byteArray, 0, readLength);
System.out.println(newData);
readLength = in.read(byteArray);
}
System.out.println();
in.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} }
 package pipeReaderWriter;

 import java.io.PipedWriter;

 public class ThreadWrite extends Thread {

     private WriteData write;
private PipedWriter out; public ThreadWrite(WriteData write, PipedWriter out) {
super();
this.write = write;
this.out = out;
} @Override
public void run() {
write.writeMethod(out);
} }
 package pipeReaderWriter;

 import java.io.PipedReader;

 public class ThreadRead extends Thread {

     private ReadData read;
private PipedReader in; public ThreadRead(ReadData read, PipedReader in) {
super();
this.read = read;
this.in = in;
} @Override
public void run() {
read.readMethod(in);
} }
 package pipeReaderWriter;

 import java.io.PipedReader;
import java.io.PipedWriter; public class Run { public static void main(String[] args) {
try {
WriteData writeData = new WriteData();
ReadData readData = new ReadData(); PipedWriter out = new PipedWriter();
PipedReader in = new PipedReader(); in.connect(out); ThreadRead threadRead = new ThreadRead(readData, in);
threadRead.start(); Thread.sleep(2000); ThreadWrite threadWrite = new ThreadWrite(writeData, out);
threadWrite.start(); } catch (Exception e) {
// TODO: handle exception
}
} }

Thread--线程间通信--管道的更多相关文章

  1. Java多线程编程核心技术---线程间通信(二)

    通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送 ...

  2. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  3. linux高级编程基础系列:线程间通信

    linux高级编程基础系列:线程间通信 转载:原文地址http://blog.163.com/jimking_2010/blog/static/1716015352013102510748824/ 线 ...

  4. java并发之线程间通信协作

    在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...

  5. Java多线程编程(三)线程间通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  6. Java多线程编程核心技术-第3章-线程间通信-读书笔记

    第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...

  7. Java多线程编程(6)--线程间通信(下)

      因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式.   在实际的软件开发过程中,经常会碰到如下场景 ...

  8. java多线程:线程间通信——生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...

  9. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  10. Java多线程编程核心技术---线程间通信(一)

    线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...

随机推荐

  1. centos7安装google-chrome和chromedriver

    1.root用户下进入到etc/yum.repos.d目录下  [root@f7d6b9f2-1291-4d2f-8805-aef94deac9f7 yum.repos.d]# pwd  /etc/y ...

  2. 《ES6标准入门》(阮一峰)--8.函数的扩展

    1.函数参数的默认值 基本用法 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log ...

  3. UVA - 679 Dropping Balls(二叉树的编号)

    题意:二叉树按层次遍历从1开始标号,所有叶子结点深度相同,每个结点开关初始状态皆为关闭,小球从根结点开始下落(小球落在结点开关上会使结点开关状态改变),若结点开关关闭,则小球往左走,否则往右走,给定二 ...

  4. duilib+cef自定义浏览器控件编译错误

    新版博客已经搭建好了,有问题请访问 htt://www.crazydebug.com 公司二期好主播项目,决定用duilib开发界面,且从ie内核换成谷歌内核 再用duilib自定义一个Browser ...

  5. R apply()函数

    创建一个列表变量,它的第一个元素包含所有从0到9的平方数,第二个元素为10到19之内的所有平方数,依此类推,最后一个元素为90到99之内的平方数.没有平方数的元素也应该被包含在内! 学习网友的解题思路 ...

  6. 利用Jenkins实现jdk11+Maven构建springboot项目

    目录 原理图 前期准备 Jdk11安装 Jenkins安装 Maven安装 Jenkins的设置 插件安装 变量配置 搭建项目 1.通用配置 2.源码管理 3.构建触发 4.Maven的构建选项 5. ...

  7. 二十六、SAP中通过FORMAT COLOR来设置文字背景颜色

    一.代码如下 二.效果如下

  8. Codeforces 459C Pashmak and Buses 机智数学题

    这个题目说的是有n个人,有k辆巴士,有m天,每天都要安排n个人坐巴士(可以有巴士为空),为了使得这n个人不会成为朋友,只要每两个人在这m天里坐的巴士至少一天不相同即可. 要你求是否有这样的安排方法,如 ...

  9. ACM-售货员难题

    题目描述:售货员的难题  某乡有n个村庄(1< n < 20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0 < s < 1000)是已知的,且A村到B村与B村到 ...

  10. 基础语法-选择结构switch

    基础语法-选择结构switch 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Switch语句特点 switch语句选择的类型在jdk1.6只支持四种:byte,short,i ...