在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. Codeforces Round #619 (Div. 2)

    A. Three Strings 题意:给三个长度相同的非空字符串abc,依次将c中的每个字符和a或者b中对应位置的字符进行交换,交换必须进行,问能否使得ab相同. 思路:对于每一个位置,如果三个字符 ...

  2. 重装系统,新安装IDEA启动项目后,classnotfound:com.mysql.jdbc.Driver

    我最后解决是:这个Test connection会自动帮你下载的,但是如果中途一直叫你try again,甚至到后面点这个test connection有弹窗,但是单窗里面的选项你点击后没反应,我是直 ...

  3. VMware CentOS网络配置

  4. Maven项目工程目录

    maven工程目录规范: src/main/java   存放项目的.java文件 src/main/resources   存放项目的资源文件,如spring.hibernate配置文件 src/t ...

  5. 八十二、SAP中的ALV创建之一,新建一个程序

    一.创建一个ALV的程序 二.填写程序属性 三.保存到本地对象 四.来到代码区,这样一个新工程就创建好了,我们后续来写相关的创建代码

  6. 111-PHP类变量之间的赋值标识为同一个对象

    <?php class mao{ //定义猫类 public $age=0; //定义多个属性并初始化 public $weight=50; public $color='white'; } $ ...

  7. 可并堆模板题-mergeable heap

    Description 有n个点,第i个点标号为i,有两种操作:0 x y 表示把x所在堆和y所在堆合并.1 x 表示询问x所在堆的最小权. Input 第一行两个整数n,m,表示有n个点m个操作. ...

  8. C# Stream篇(七) -- NetworkStream

    NetworkStream 目录: NetworkStream的作用 简单介绍下TCP/IP 协议和相关层次 简单说明下 TCP和UDP的区别 简单介绍下套接字(Socket)的概念 简单介绍下Tcp ...

  9. Yota Phone宣告破产

    作为双面屏手机的开山鼻祖,Yota Phone已经消失在大家的视线中. 据外媒报道称,开曼群岛最高法院裁定在开曼群岛注册的YotaPhone手机生产商Yota Devices公司破产.法院的相关裁定被 ...

  10. 个人微信开发API协议(转)

    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sd ...