目录
上代码:
输出:
执行流程可以总结如下:
上代码:
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();
    }
}
输出:

执行流程可以总结如下:
- 线程 ReaderThread开始执行,调用管道reader的read()方法,该方法会一直阻塞,直到有数据可以读取。
- 线程 WriterThread开始执行,调用管道writer的write("test")方法,向管道中写入字符串 "test"。
- 线程 WriterThread调用writer.close()方法,结束管道的写入,并执行完毕。
- 线程 ReaderThread接收到管道输出的字符串 "test" 并打印。
- 线程 ReaderThread执行完毕,程序结束。
简单来说,就是通过管道实现了两个线程之间的通信,其中一个线程往管道写入数据,另一个线程从管道读取数据并进行相应处理。管道的读取和写入操作是阻塞的,也就是说,如果没有数据可以读取,读取操作会一直等待,直到有数据可读;同样,如果管道已经关闭,写入操作也会失败。这种方式可以很好地实现线程之间的同步和通信。



















