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

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

  1)PipedInputStream和PipedOutputStream

  2)PipedReader和PipedWriter

1)PipedInputStream和PipedOutputStream

  1. package pipeInputOutput;
  2.  
  3. import java.io.PipedOutputStream;
  4.  
  5. public class WriteData {
  6.  
  7. public void writeMethod(PipedOutputStream out) {
  8. try {
  9. System.out.println("write :");
  10. for(int i=0; i<30000; i++) {
  11. String outData = "" + (i+1);
  12. out.write(outData.getBytes());
  13. System.out.print(outData);
  14. }
  15. System.out.println();
  16. out.close();
  17. } catch (Exception e) {
  18. // TODO: handle exception
  19. e.printStackTrace();
  20. }
  21. }
  22.  
  23. }
  1. package pipeInputOutput;
  2.  
  3. import java.io.PipedInputStream;
  4.  
  5. public class ReadData {
  6.  
  7. public void readMethod(PipedInputStream in) {
  8. try {
  9. byte[] byteArray = new byte[20];
  10. int readLength = in.read(byteArray);
  11. while(readLength != -1) {
  12. System.out.print("read :");
  13. String newData = new String(byteArray, 0, readLength);
  14. System.out.println(newData);
  15. readLength = in.read(byteArray);
  16. }
  17. System.out.println();
  18. in.close();
  19. } catch (Exception e) {
  20. // TODO: handle exception
  21. e.printStackTrace();
  22. }
  23. }
  24.  
  25. }
  1. package pipeInputOutput;
  2.  
  3. import java.io.PipedOutputStream;
  4.  
  5. public class ThreadWrite extends Thread {
  6.  
  7. private WriteData write;
  8. private PipedOutputStream out;
  9.  
  10. public ThreadWrite(WriteData write, PipedOutputStream out) {
  11. super();
  12. this.write = write;
  13. this.out = out;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. write.writeMethod(out);
  19. }
  20.  
  21. }
  1. package pipeInputOutput;
  2.  
  3. import java.io.PipedInputStream;
  4.  
  5. public class ThreadRead extends Thread {
  6.  
  7. private ReadData read;
  8. private PipedInputStream in;
  9.  
  10. public ThreadRead(ReadData read, PipedInputStream in) {
  11. super();
  12. this.read = read;
  13. this.in = in;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. read.readMethod(in);
  19. }
  20.  
  21. }
  1. package pipeInputOutput;
  2.  
  3. import java.io.PipedInputStream;
  4. import java.io.PipedOutputStream;
  5.  
  6. public class Run {
  7.  
  8. public static void main(String[] args) {
  9. try {
  10. WriteData writeData = new WriteData();
  11. ReadData readData = new ReadData();
  12.  
  13. PipedInputStream inputStream = new PipedInputStream();
  14. PipedOutputStream outputStream = new PipedOutputStream();
  15.  
  16. outputStream.connect(inputStream);
  17.  
  18. // outputStream.write("hello world".getBytes());
  19. // byte[] bs = new byte[100];
  20. // int i = inputStream.read(bs);
  21. // System.out.println(new String(bs,0,i));
  22.  
  23. ThreadRead threadRead = new ThreadRead(readData, inputStream);
  24. threadRead.start();
  25.  
  26. Thread.sleep(2000);
  27.  
  28. ThreadWrite threadWrite = new ThreadWrite(writeData, outputStream);
  29. threadWrite.start();
  30. } catch (Exception e) {
  31. // TODO: handle exception
  32. e.printStackTrace();
  33. }
  34. }
  35.  
  36. }

2)PipedReader和PipedWriter

  1. package pipeReaderWriter;
  2.  
  3. import java.io.PipedWriter;
  4.  
  5. public class WriteData {
  6.  
  7. public void writeMethod(PipedWriter out) {
  8. try {
  9. System.out.println("write :");
  10. for(int i=0; i<300; i++) {
  11. String outData = "" + (i+1);
  12. out.write(outData);
  13. System.out.println(outData);
  14. }
  15. System.out.println();
  16. out.close();
  17. } catch (Exception e) {
  18. // TODO: handle exception
  19. e.printStackTrace();
  20. }
  21. }
  22.  
  23. }
  1. package pipeReaderWriter;
  2.  
  3. import java.io.PipedReader;
  4.  
  5. public class ReadData {
  6.  
  7. public void readMethod(PipedReader in) {
  8. try {
  9. System.out.println("read:");
  10. char[] byteArray = new char[20];
  11. int readLength = in.read(byteArray);
  12. while(readLength != -1) {
  13. String newData = new String(byteArray, 0, readLength);
  14. System.out.println(newData);
  15. readLength = in.read(byteArray);
  16. }
  17. System.out.println();
  18. in.close();
  19. } catch (Exception e) {
  20. // TODO: handle exception
  21. e.printStackTrace();
  22. }
  23. }
  24.  
  25. }
  1. package pipeReaderWriter;
  2.  
  3. import java.io.PipedWriter;
  4.  
  5. public class ThreadWrite extends Thread {
  6.  
  7. private WriteData write;
  8. private PipedWriter out;
  9.  
  10. public ThreadWrite(WriteData write, PipedWriter out) {
  11. super();
  12. this.write = write;
  13. this.out = out;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. write.writeMethod(out);
  19. }
  20.  
  21. }
  1. package pipeReaderWriter;
  2.  
  3. import java.io.PipedReader;
  4.  
  5. public class ThreadRead extends Thread {
  6.  
  7. private ReadData read;
  8. private PipedReader in;
  9.  
  10. public ThreadRead(ReadData read, PipedReader in) {
  11. super();
  12. this.read = read;
  13. this.in = in;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. read.readMethod(in);
  19. }
  20.  
  21. }
  1. package pipeReaderWriter;
  2.  
  3. import java.io.PipedReader;
  4. import java.io.PipedWriter;
  5.  
  6. public class Run {
  7.  
  8. public static void main(String[] args) {
  9. try {
  10. WriteData writeData = new WriteData();
  11. ReadData readData = new ReadData();
  12.  
  13. PipedWriter out = new PipedWriter();
  14. PipedReader in = new PipedReader();
  15.  
  16. in.connect(out);
  17.  
  18. ThreadRead threadRead = new ThreadRead(readData, in);
  19. threadRead.start();
  20.  
  21. Thread.sleep(2000);
  22.  
  23. ThreadWrite threadWrite = new ThreadWrite(writeData, out);
  24. threadWrite.start();
  25.  
  26. } catch (Exception e) {
  27. // TODO: handle exception
  28. }
  29. }
  30.  
  31. }

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. UVA - 816 Abbott's Revenge(bfs)

    题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...

  2. ExcelPackage导入导出,命名空间一定要是EPPlus

    1.引入EPPlus.dll,旧版的是OfficeOpenXml.dll,最好使用EPPlus2.调用 string path = UploadExecl(batchUpload.BinaryExce ...

  3. [洛谷Luogu]P1803 线段覆盖问题

    贪心想法题解的各位dalaodalaodalao都讲得很清楚了,在下就提供一种桶排的做法吧. 因为给出数据范围 0≤ai<bi≤10000000≤ai<bi≤10000000≤ai< ...

  4. 157-PHP strrchr函数输出最后一次出现字母p的位置到字符串结尾的所有字符串

    <?php $str='PHP is a very good programming language!'; //定义一个字符串 echo strrchr($str,'o'); //输出最后一次 ...

  5. FindWindowXG

    测试: 函数代码: function FindWindowXG(strClass, strTitle: string): THandle; var hd: THandle; arrClass: ..] ...

  6. 换根dp

    感觉这类问题很少?算了,还是拿出来水一下吧qwq... 首先来看一道例题:POJ3585 一句话题意:树上任意源点多汇点最大流 你看这不就是个最大流的板子题吗?我先建个图,然后跑最大流,然后,,,然后 ...

  7. tkinter中控件menu的两种组织方法

    tkinter中,菜单控件组织方法有两种,使用中常出现混淆,为明晰各个正确用法,特整理撰写此博文.菜单控件的组织实际上是通过一个“母菜单”和“子菜单”构成,“母菜单”一方面与master连接(即与依附 ...

  8. 逆向-PE头解析

    目录 PE头解析 数据结构 IMAGE_DOS_HEADER IMAGE_NT_HEADERS 区块 PE头解析 PE 格式是Windows系统下组织可执行文件的格式.PE文件由文件头和对应的数据组成 ...

  9. UVA - 12107 Digit Puzzle(数字谜)(IDA*)

    题意:给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜中所有涉及的数必须是没有前导零的正数.输入数字谜一定形如a*b=c,其中a.b.c分别最 ...

  10. 解决CGrIdCtrl合并单元格后继续拆分后的问题

    DWORD dwMergeCellCount = vMergeCells.size(); ; i < dwMergeCellCount; i++){ m_HFlexGrid.SplitCells ...