目录
上代码:
输出:
执行流程可以总结如下:
上代码:
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;}@Overridepublic 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;}@Overridepublic 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
执行完毕,程序结束。
简单来说,就是通过管道实现了两个线程之间的通信,其中一个线程往管道写入数据,另一个线程从管道读取数据并进行相应处理。管道的读取和写入操作是阻塞的,也就是说,如果没有数据可以读取,读取操作会一直等待,直到有数据可读;同样,如果管道已经关闭,写入操作也会失败。这种方式可以很好地实现线程之间的同步和通信。