管道流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. 放yy直播点赞动画

    最近在做直播相关的东西,这个动画是IOS先撸出来的,后来android这边要模仿,大部分直播应用都有很炫酷的点赞动画,所以也没什么好稀奇的.如果有现成的轮子了,就没必要自己再造了,后来参照了程序亦非猿 ...

  2. LoadRunner压力测试实例

    1 LoadRunner 概要介绍... 2 .项目背景介绍... 5 .使用LoadRunner进行负载/ 实施测试... 16 6.1 Memory相关... 22 6.2 Processor相关 ...

  3. linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)

    学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从 ...

  4. 利用JQuery直接调用asp.net后台方法

    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. [WebMethod]   命名空间 1.无参数的方法调用, 注意:1.方法一定要静态方法,而且要有[WebMethod] ...

  5. OAF实现下拉菜单联动

    当需要输入多个下拉菜单选项时,可能某些下拉菜单是有级联关系的.这时候就需要使用级联的下拉菜单来解决.下面的教程将介绍如何使用ppr制作级联下拉菜单 一.新建AM 在test.oracle.apps.c ...

  6. 服务端技术进阶(二)JBoss和tomcat的区别

    JBoss和tomcat的区别 注意JBoss和tomcat是不一样,JBoss是一个可伸缩的服务器平台,当你的EJB程序编制完成后,如果访问量增加,只要通过增加服务器硬件就可以实现多台服务器同时运算 ...

  7. ngnix服务器搭建

    1.  到nginx官网上下载相应的安装包,http://nginx.org/en/download.html:下载进行解压,将解压后的文件放到自己心仪的目录下,我的解压文件放在了d盘根目录下,如下图 ...

  8. Linux - test测试标志的意思总结

    测试的标志 代表意义 1. 关於某个档名的『文件类型』判断,如 test -e filename 表示存在否 -e 该『档名』是否存在?(常用) -f 该『档名』是否存在且为文件(file)?(常用) ...

  9. PS 滤镜——旋转模糊

    这里给出灰度图像的模糊算法,彩色图像只要分别对三个通道做模糊即可. %%  spin blur % 旋转模糊 clc; clear all; close all; I=imread('4.jpg'); ...

  10. init()和onEnter()方法的区别

    init()和onEnter()这俩个方法都是CCNode的方法.其区别如下: 1.其被调用的顺序是先init(),后onEnter(). 2.init()在类的初始化时只会调用一次. 3.onEnt ...