美文网首页
9.线程间通信:管道

9.线程间通信:管道

作者: xialedoucaicai | 来源:发表于2018-07-10 14:38 被阅读0次

管道流是一种特殊的流,可以在不同线程之间传递数据。一个线程发送数据到输出管道,另一个线程从输入管道读取数据,而无需借用临时文件。

管道流包含这四个类:
字节流
PipedInputStream
PipedOutputStream
字符流
PipedReader
PipedWriter

具体使用和普通的流一样,唯一不同的是,需要把输入流和输出流连接起来。看一个字节流的代码示例,还是比较简单的。
输入流

public class PipedByteInput {
    PipedInputStream pipedInputStream = null;
    
    public PipedByteInput(PipedInputStream pipedInputStream) {
        this.pipedInputStream = pipedInputStream;
    }
    
    public void readData() throws Exception{
        byte [] b = new byte[20];
        int eof = 0;
        StringBuilder result = new StringBuilder("");
        try{
            while((eof =pipedInputStream.read(b))!=-1){
                result.append(new String(b,0,eof));
            }
        }finally{
            pipedInputStream.close();
        }
        System.out.println("读取到的数据:"+result);
    }
}

输入流线程

public class ReadThread extends Thread{
    PipedByteInput pipedByteInput = null;
    
    public ReadThread(PipedByteInput pipedByteInput) {
        this.pipedByteInput = pipedByteInput;
    }
    
    @Override
    public void run() {
        try {
            pipedByteInput.readData();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出流

public class PipedByteOutput {
    PipedOutputStream pipedOutputStream = null;
    
    public PipedByteOutput(PipedOutputStream pipedOutputStream) {
        this.pipedOutputStream = pipedOutputStream;
    }
    
    public void writeData(String text) throws Exception{
        try{
            pipedOutputStream.write(text.getBytes());   
        }finally{
            pipedOutputStream.close();  
        }
    }
}

输出流线程

public class WriteThread extends Thread{
    PipedByteOutput pipedByteOutput = null;
    public WriteThread(PipedByteOutput pipedByteOutput) {
        this.pipedByteOutput = pipedByteOutput;
    }
    @Override
    public void run() {
        try {
            pipedByteOutput.writeData("PipedByteOutput write data..");  
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Main

public class Main {
    public static void main(String[] args) throws InterruptedException, IOException {
        PipedInputStream pis = new PipedInputStream();
        PipedOutputStream pos = new PipedOutputStream();
        //将管道输入流和输出流关联起来
        pis.connect(pos);
        
        PipedByteInput read = new PipedByteInput(pis);
        PipedByteOutput write = new PipedByteOutput(pos);
        
        ReadThread readThread = new ReadThread(read);
        WriteThread writeThread = new WriteThread(write);
        
        readThread.start();
        Thread.sleep(2000);
        writeThread.start();
    }
}

相关文章

  • 9.线程间通信:管道

    管道流是一种特殊的流,可以在不同线程之间传递数据。一个线程发送数据到输出管道,另一个线程从输入管道读取数据,而无需...

  • 浏览器运行原理

    进程 申请和拥有计算机资源 不同进程间通信通过进程间通信管道IPC 线程 一个进程多个线程,每个线程执行不同的任务...

  • 2017.12.27三题

    1.Android线程间通信有哪些方式? 共享变量(内存) 管道 handler机制:runOnUiThread(...

  • Linux 进程间通信

    进程间通信 一 进程间通信 -- 管道 mkfifo test 创建管道文件 匿名管道和命名管道:匿名管道:匿名管...

  • Linux-C-day-2-进程通过--管道通信

    管道通信 进程间管道通信方式可以通过man 7 pipe来查看; 匿名管道 单工管道 打开管道:使用popen()...

  • Java 通过管道进行线程间通信

    Java 中的管道流(pipeStream)可以在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从...

  • ios 多线程的故事4

    线程间通信 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个...

  • 进程间通信--管道通信

    进程间通信在两个进程之间,每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到。比如,在...

  • python 管道

    python的管道通信是指进程间的通信,在此简单记录下管道通信的小程序: 管道的读端代码: 写端代码:

  • 系统与网络编程(进程间通信)

    进程间通信 ipc:interprocess communication 通信方式 管道通信Paste_Image...

网友评论

      本文标题:9.线程间通信:管道

      本文链接:https://www.haomeiwen.com/subject/piefpftx.html