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