> 文章列表 > Java 管道 (学习代码)

Java 管道 (学习代码)

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

输出:

执行流程可以总结如下:

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

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