Java 管道 (学习代码)

目录

上代码:

输出:

执行流程可以总结如下:


上代码:

package cn.net.cdsz.ccb.test;

import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;

public class test {

    static class ReaderThread implements Runnable {
        private PipedReader reader;
        public ReaderThread(PipedReader reader) {
            this.reader = reader;
        }
        @Override
        public void run() {
            System.out.println("this is reader");
            int receive = 0;
            try {
                while ((receive = reader.read()) != -1) {
                    System.out.print((char)receive);
                }
                System.out.println();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    static class WriterThread implements Runnable {
        private PipedWriter writer;
        public WriterThread(PipedWriter writer) {
            this.writer = writer;
        }
        @Override
        public void run() {
            System.out.println("this is writer");
            int receive = 0;
            try {
                writer.write("test");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static void main(String[] args) throws IOException, InterruptedException{
        PipedWriter writer = new PipedWriter();
        PipedReader reader = new PipedReader();
        writer.connect(reader); // 这⾥注意⼀定要连接,才能通信
        new Thread(new ReaderThread(reader)).start();
        Thread.sleep(1000);
        new Thread(new WriterThread(writer)).start();
    }
}

输出:

Java 管道 (学习代码)_第1张图片

执行流程可以总结如下:

  1. 线程 ReaderThread 开始执行,调用管道 readerread() 方法,该方法会一直阻塞,直到有数据可以读取。
  2. 线程 WriterThread 开始执行,调用管道 writerwrite("test") 方法,向管道中写入字符串 "test"。
  3. 线程 WriterThread 调用 writer.close() 方法,结束管道的写入,并执行完毕。
  4. 线程 ReaderThread 接收到管道输出的字符串 "test" 并打印。
  5. 线程 ReaderThread 执行完毕,程序结束。

简单来说,就是通过管道实现了两个线程之间的通信,其中一个线程往管道写入数据,另一个线程从管道读取数据并进行相应处理。管道的读取和写入操作是阻塞的,也就是说,如果没有数据可以读取,读取操作会一直等待,直到有数据可读;同样,如果管道已经关闭,写入操作也会失败。这种方式可以很好地实现线程之间的同步和通信。

你可能感兴趣的:(并发,日常代码,java,android,开发语言)