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

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM