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. springcloud中通过Filter实现微服务跨域访问允许

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.an ...

  2. [raspberry pi3] hadoop 编译搭建和配置

    Causion: 只有一个raspberry pi3的就随便玩玩吧,瓶颈不在在cpu, 1 G的内存实在是太少了,跑个hadoop就很辛苦了 下面是瞎折腾的过程: oracle的arm jdk的安装过 ...

  3. SQL SERVER 取本月上月日期

    select   dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate()))     /*上个月一号*/ s ...

  4. DropDownList 控件的SelectedIndexChanged事件触发不了

    先看看网友的问题: 根据Asp.NET的机制,在html markup有写DropDownList控件与动态加载的控件有点不一样.如果把DropDownList控件写在html markup,即.as ...

  5. JavaScript 测试和捕捉(try与catch)

    JavaScript 测试和捕捉 try 语句允许我们定义在执行时进行错误测试的代码块. catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块. JavaScript 语句 try ...

  6. TensorFlow创建变量

    1 使用tf.Variable函数创建变量 tf.Variable(initial_value=None,trainable=True,collections=None,validate_shape= ...

  7. JavaWeb中MVC的使用--以管理系统举例

    开发环境:JavaSE1.7.JavaEE7.0.JSTL1.2.2.Web2.3.MySQL5.5.28 系统分析与功能设计: 本系统实现商品信息的管理,应包括以下几个功能: 商品信息列表:列出所有 ...

  8. luogu P3811线性求逆元

    首先扩O:T了一个点(因为上界松),83分. #include <cstdio> using namespace std; int n, p; void exgcd(int a, int ...

  9. 公有云Docker镜像P2P加速之路:安全篇

    一.问题 在使用Docker运行容器化应用时,宿主机通常先要从Registry服务(如Docker Hub)下载相应的镜像(image).这种镜像机制在开发环境中使用还是很有效的,团队成员之间可以很方 ...

  10. swift3.0 原生网络请求

    func loadData()  { let urlString = baseURL + NewsListURL + "\(self.page)"+"/20" ...