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. Java50道经典习题-程序32 左移右移

    题目:取一个整数a从右端开始的4-7位.分析:比如取123456789从右端开始的4-7位即:3456(1)先使a右移4位.(2)设置一个低4位全为1,其余全为0的数.可用~(~0<<4) ...

  2. 内存不足导致的java.lang.OutOfMemoryError: java heap space引出java工程启动参数设置

    今天做分类实验,生成了190m的kernel文件,在读到svm中的时候跳出了java.lang.OutOfMemoryError: java heap space异常.随便搜了一下,发现与eclips ...

  3. eclipse workspace 共享设置

    总结一下,复制工作空间配置步骤如下: 1 使用eclipse新建workspace. 2 将新建的workspace下的.metadata\.plugins内容全部删除. 3 将需要拷贝的worksp ...

  4. ChineseLunisolarCalendar 农历日期

    #region 农历日期 static ChineseLunisolarCalendar cCalendar = new ChineseLunisolarCalendar(); /// <sum ...

  5. Dapper相关了解

    公司新项目用的是Dapper,做的时候没有具体看dapper的具体用法,现在回来回顾总结一下. 1-总体介绍dapper 我们都知道ORM全称叫做Object Relationship Mapper, ...

  6. Tomcat 集群 + Redis Session 共享出现 Session 瞬间失效问题

    写在前面的话 写这篇博客出于公司最近要迁移到新的云上面且对之前的资源,架构做一个升级. 本来是一个不大的项目,旧环境旧一个 TOMCAT 跑起来,不过出于高可用考虑,新环境决定使用 TOMCAT 集群 ...

  7. Quick Reference Card Urls For Web Developer

    C# C# Cheatsheet & Notes Coding Guidelines for C# 3.0, 4.0, 5.0 Core C# and .NET Quick Reference ...

  8. redis-淘汰策略

    将redis用作缓存时,如果内存空间用满,就会自动驱逐老的数据.默认情况下,memcached就是这种方式. LRU是Redis唯一支持的回收算法. maxmemory配置指令 maxmemory用于 ...

  9. 关于jquery.extend()的坑:我的数组变成相同元素了?

    首先呢我有一个数组,存放了多个json对象.这些json对象的属性有缺失,我设置了一个对象模板来存放默认值 先来看一段代码 var source = [ { name: 'dapianzi', bor ...

  10. P1969 积木大赛

    题意:给你一段序列,一次操作:[l,r]内所有数+1 初始序列全为0 现在给你最后序列,问最少操作几次能达到这样的序列 蒟蒻表示秒想到------差分啊 每次差分必有一个+1,一个-1 把差分数组求出 ...