java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而不必借助类似临时文件之类的东西。jdk提供4个类来使线程建可以进行通信。

(1)PipedInputStream与PipedOutputStream

(2)PipedReader与PipedWriter

(1)PipedInputStream与PipedOutputStream

package com.ming.thread.pipeinputoutput;

import java.io.PipedInputStream;

public class ReadData {

    public void readMethod(PipedInputStream input){
try {
System.out.println("read :");
byte[] byteArray=new byte[20];
int readLength=input.read(byteArray);
while(readLength!=-1){
String newData=new String(byteArray,0,readLength);
System.out.print(newData);
readLength=input.read(byteArray);
}
System.out.println();
input.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
package com.ming.thread.pipeinputoutput;

import java.io.PipedOutputStream;

public class WriteData {

    public void writeMethod(PipedOutputStream out){
try {
System.out.println("write :");
for(int i=0;i<300;i++){
String outData="" +(i+1);
out.write(outData.getBytes());
System.out.print(outData);
}
System.out.println();
out.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
package com.ming.thread.pipeinputoutput;

import java.io.PipedOutputStream;

public class ThreadWrite extends Thread {

    WriteData write;

    PipedOutputStream out;

    public ThreadWrite(WriteData write,PipedOutputStream out){
this.write=write;
this.out=out;
} public void run(){
write.writeMethod(out);
}
}
package com.ming.thread.pipeinputoutput;

import java.io.PipedInputStream;

public class ThreadRead extends Thread {

    ReadData read;

    PipedInputStream input;

    public ThreadRead(ReadData read,PipedInputStream input){
this.read=read;
this.input=input;
} public void run(){
read.readMethod(input);
}
}
package com.ming.thread.pipeinputoutput;

import java.io.PipedInputStream;
import java.io.PipedOutputStream; /**
* 管道流的一个测试
* @author mingge
*
*/
public class Run { public static void main(String[] args) {
try {
WriteData writeData=new WriteData();
ReadData readData=new ReadData();
PipedInputStream input=new PipedInputStream();
PipedOutputStream out=new PipedOutputStream();
out.connect(input);
ThreadRead threadRead=new ThreadRead(readData, input);
threadRead.start();
Thread.sleep(2000);
ThreadWrite threadWrite=new ThreadWrite(writeData, out);
threadWrite.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}

(2)PipedReader与PipedWriter

package com.ming.thread.pipereaderwriter;

import java.io.PipedReader;

public class ReadData {

    public void readMethod(PipedReader read){
try {
System.out.println("read :");
char[] byteArray=new char[20];
int readLength=read.read(byteArray);
while(readLength!=-1){
String newData=new String(byteArray, 0, readLength);
System.out.print(newData);
readLength=read.read(byteArray);
}
System.out.println();
read.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.ming.thread.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.print(outData);
}
System.out.println();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.ming.thread.pipereaderwriter;

import java.io.PipedReader;

public class ThreadReader extends Thread {

    ReadData read;

    PipedReader input;

    public ThreadReader(ReadData read,PipedReader input){
this.read=read;
this.input=input;
} public void run(){
read.readMethod(input);
}
}
package com.ming.thread.pipereaderwriter;

import java.io.PipedWriter;

public class ThreadWrite extends Thread {

    WriteData write;

    PipedWriter out;

    public ThreadWrite(WriteData write,PipedWriter out){
this.write=write;
this.out=out;
} public void run(){
write.writeMethod(out);
}
}
package com.ming.thread.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(); PipedReader inputStream=new PipedReader();
PipedWriter outputStream=new PipedWriter();
outputStream.connect(inputStream); ThreadReader threadRead=new ThreadReader(readData, inputStream);
threadRead.start(); Thread.sleep(2000); ThreadWrite threadWrite=new ThreadWrite(writeData, outputStream);
threadWrite.start(); } catch (Exception e) {
e.printStackTrace();
}
}
}

就是看代码就可以了...

java多线程通过管道流实现不同线程之间的通信的更多相关文章

  1. java多线程之管道流

    java语言中提供了各种各样的流供我们操纵数据,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据. 一个线程发送数据到输出管道,另一个线程从输入管道读取数据,通过使用管道 ...

  2. 应用java多线程实现server端与多client之间的通信

    应用多线程来实现server与多线程之间的通信的基本步骤 1.server端创建ServerSocket,循环调用accept()等待client链接 2.client创建一个Socket并请求和se ...

  3. JAVA多线程提高四:多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  4. Java多线程编程-线程之间的通信

    转载自:这里 学习了基础的线程知识 看到了 线程之间的通信 线程之间有哪些通信方式呢? 1.同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public ...

  5. Java中的管道流 PipedOutputStream和PipedInputStream

    我们在学习IO流的时候可能会学字节流.字符流等,但是关于管道流的相信大部分视频或者教程都是一语带过,第一个是因为这个东西在实际开发中用的也不是很多,但是学习无止境,存在既有理.JDK中既然有个类那说明 ...

  6. 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream

    目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...

  7. Java多线程编程核心技术-第3章-线程间通信-读书笔记

    第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...

  8. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

  9. Java多线程系列--“基础篇”07之 线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

随机推荐

  1. c# 省市区联动

    http://www.matrixkey.com.cn/blog/article.asp?id=427 建议楼主去这里看看:http://pagetalks.com/2010/03/22/jquery ...

  2. FineUI从iis6迁移到iis7.5上遇到的奇葩事情

    前天把一台旧服务器上的windows2003+iis6上的fineui项目迁移到了win7+iis7上面来了,没有编译,直接以源码方式运行. 本来运行的好好的,昨天下午在上面用vs2010打开了一下看 ...

  3. [Windows] 程序生成出现语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符”

    程序生成出现语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符” 将平台工具集改为VS 2015 (v140) ,重新编译即可

  4. asp如何让panel居中

    把panel放在一个table的td中,并把position设为relative,就可以在设计中直接调整它的位置了

  5. P2542 [AHOI2005]航线规划 LCT维护双连通分量

    \(\color{#0066ff}{ 题目描述 }\) 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel ...

  6. spring boot 下websocket实现的两种方法

    websocket前台实现代码,保存为html执行就好 html代码来自:https://blog.csdn.net/M348915654/article/details/53616837 <h ...

  7. CF628D Magic Numbers (数据大+数位dp)求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数

    题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).a,b<10^2000,m≤2000,0≤d≤9 a,b< ...

  8. ORA-14517: Subpartition of index "string.string" is in unusable state

    今天碰到个ORA-03113, 原因不明. 猜测因为某些table DDL操作过后导致index unuable的case, 然后进行analyze table, 再碰到ORA-14517.  最后通 ...

  9. day32 线程

    1.     线程是什么,有了进程为什么还要线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率.很多人就不理解了,既然进程这么优秀,为什么 ...

  10. storm定时器

    package com.example.mail; import org.apache.storm.Config; import org.apache.storm.LocalCluster; impo ...