管道流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线程间通信之通过管道进行通信的更多相关文章

  1. Java线程间通信-回调的实现方式

    Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互.   比如举一个简单例子,有一个多线程的 ...

  2. 说说Java线程间通信

    序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...

  3. 说说 Java 线程间通信

    序言 正文 一.Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在一个 ...

  4. Java 线程间通讯(共享变量方式)

    Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题. 一.没考虑线程同步: package com.wyf; publi ...

  5. Java 线程间通讯(管道流方式)

    一.管道流是JAVA中线程通讯的常用方式之一,基本流程如下: 1)创建管道输出流PipedOutputStream pos和管道输入流PipedInputStream pis 2)将pos和pis匹配 ...

  6. Java线程间通信之wait/notify

    Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.我们来看下相关定义: w ...

  7. java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  8. Java——线程间通信

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. java线程间通信1--简单实例

    线程通信 一.线程间通信的条件 1.两个以上的线程访问同一块内存 2.线程同步,关键字 synchronized 二.线程间通信主要涉及的方法 wait(); ----> 用于阻塞进程 noti ...

随机推荐

  1. MPlayer 使用手册中文版

    播放文件 使用 MPlayer 播放媒体文件最简单的方式是: mplayer <somefile> MPlayer 会自动检测文件的类型并加以播放,如果是音频文件,则会在命令行中显示该播放 ...

  2. apache 配置详解

    三种MPM介绍                                                                               Apache 2.X  支持 ...

  3. Socket层实现系列 — accept()的实现(一)

    本文主要介绍了accept()的系统调用.Socket层实现,以及TCP层实现. 内核版本:3.6 Author:zhangskd @ csdn blog 应用层 int accept(int soc ...

  4. Java中如何封装自己的类,建立并使用自己的类库?

    from:http://blog.csdn.net/luoweifu/article/details/7281494 随着自己的编程经历的积累会发现往往自己在一些项目中写的类在别的项目中也会有多次用到 ...

  5. VS2010 / MFC + OpenCV 2.4.9打开图片

    原文地址:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=30832 第一部分,参考http://jingyan.baidu.com ...

  6. 【55】java异常机制剖析

    一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用.有异常就说明程序存在问题,有助于我们 ...

  7. Android开发技巧——自定义控件之组合控件

    Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...

  8. UITabbar的一些常规用法(总结)

    往往系统自带的UITabbar 不能满足我们的样式或者颜色设计,所以需要调整UITabbar. 1.自定义UITabbar,也是我学到的第一种方式(简单暴力). 先记录一下思路: 首先,隐藏系统自带的 ...

  9. 面试之路(7)-BAT面试题之计算机的三大原则

    1.计算机是执行输入.运算.输出的机器 计 算 机 的 硬 件 由 大 量 的 IC(Integrated Circuit,集成电路)组成.每块 IC 上都带有许多引脚.这些引脚有的用于输入,有的用于 ...

  10. obj-c编程10:Foundation库中类的使用(5)[时间对象]

    隔了好久才有了这新的一篇,还是无奈的时间啊!so这次我们就着重谈谈它喽. F库中有很多时间相关的类,比如NSDate,NSTimeInterval,NSTimeZone,NSDateComponent ...