java多线程通过管道流实现不同线程之间的通信

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();
        }
    }
}

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

时间: 2024-10-11 03:40:55

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

多线程之多窗口卖票&amp;线程之间的通信

案例一:使用多线程完成三个窗口卖票(不能出现重复卖票以及负数票) 卖票程序SellTicket 这里使用Lock类中的方法实现加锁和释放锁! package cn.itcast.thread2; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Runnable { private int ticke

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

应用多线程来实现server与多线程之间的通信的基本步骤 1.server端创建ServerSocket,循环调用accept()等待client链接 2.client创建一个Socket并请求和server端链接 3.server端接受client请求,创建socekt与该client建立专线链接 4.建立链接的socket在一个单独的线程上对话 5.server继续等待新的链接 server端Server.java package test.concurrent.socket; import

Java 多线程详解(五)------线程的声明周期

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程:http://www.cnblogs.com/ysocean/p/6883491.html Java 多线程详解(三)------线程的同步:http://www.cnblogs.com/ysocean/p/6883729.html Java 多线程详解(四)------生产者和消费者:http:/

java多线程基本概述(五)——线程通信

线程之间的通信可以通过共享内存变量的方式进行相互通信,也可以使用api提供的wait(),notify()实现线程之间的通信.wait()方法是Object类的方法,改方法用来将当前的线程置入"预执行队列"中,并且在wait()方法代码处停止执行进行等待,知道接收到同一个monitor对象的notify()或者notifyAll()方法的通知或者是收到中断.在调用wait()方法之前,线程必须获得锁,即只能在同步方法或者同步块中调用wait()方法,在执行wait()后,当前线程释放锁

Java学习笔记46(多线程三:线程之间的通信)

多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个线程一个输入,一个输出 package demo; public class Resource { public String name; public String sex; } 输入线程: package demo; public class Input implements Runnable

“全栈2019”Java多线程第四十一章:读锁与写锁之间相互嵌套例子

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十一章:读锁与写锁之间相互嵌套例子 下一章 "全栈2019"Java多线程第四十二章:获取线程与读写锁的保持数 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&quo

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

vc 基于对话框多线程编程实例——线程之间的通信

 vc基于对话框多线程编程实例--线程之间的通信 实例: vc 基于对话框多线程编程实例--线程之间的通信,码迷,mamicode.com

iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码) 三.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题(存钱取钱的例子,多个售票员卖票的例子) 安全隐患解决的方法 --- 互斥锁(图解)