在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. SQL语句--分组统计

    一.教师号 星期号 是否有课1 2 有1 3 有2 1 有3 2 有`1 2 有写一条sql语句让你变为这样的表教师号 星期一 星期二 星期三1 2 12 13 1各星期下的数字表示:对应的教师在星期 ...

  2. 12.swoole学习笔记--锁机制

    <?php //创建锁对象 $lock=new swoole_lock(SWOOLE_MUTEX);//互斥锁 echo "创建互斥锁\n"; //开始锁定 主进程 $loc ...

  3. (转载)wchar_t类型和char类型变量相互转换

    转载连接:https://www.cnblogs.com/zhangdewang/p/11420410.html和https://www.cnblogs.com/lanhaicode/p/105742 ...

  4. Python 爬虫是什么

    作为程序员,相信大家对“爬虫”这个词并不陌生,身边常常会有人提这个词,在不了解它的人眼中,会觉得这个技术很高端很神秘.不用着急,我们的爬虫系列就是带你去揭开它的神秘面纱,探寻它真实的面目. ! 爬虫是 ...

  5. 解决对路径bin\roslyn..的访问被拒绝

    使用visual studio开发,一重新编译就会报错: 对路径“bin\roslyn\System.Reflection.Metadata.dll”的访问被拒绝 一开始的解决办法就是把bin下的文件 ...

  6. Delphi 10.4 最新消息

    官方发布了关于10.4的消息,译文如下: 做为我们的Delphi,C ++ Builder和RAD Studio的订阅客户,除了获得更新,升级和技术支持等主要好处外,我们还邀请订阅客户参加Beta计划 ...

  7. HZNU-ACM寒假集训Day12小结 数论入门 题解

    算不出的等式 BJOI2012 看到这题 真没什么办法 无奈看题解 1.注意到p/q 联想到斜率 2.注意到 [ ] 联想到整点 注意到k在变化,构造一次函数 f(x)=p/q*x ,g(x)=q/p ...

  8. CentOS7上防火墙操作

    firewalld打开关闭防火墙与端口 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl statu ...

  9. oracle函数创建与调用

    函数的定义: CREATE OR REPLACE FUNCTION FUNCTION_TEST(PARAMER1 IN VARCHAR, -- 参数的类型不写长度 PARAMER2 OUT VARCH ...

  10. jdk的配置和安装

    1.Jdk的安装和配置 一.安装JDK与配置环境与检验配置成功: 1.进入java.com网站,然后按照以下步骤进行 =>=>等会出现java茶杯双击,一次一次的按下一步,最后会在同一个j ...