多线程编程-线程间通信.管道(五)

本文介绍如何使用Java中的管道流(Pipe Stream)实现线程间的数据通信。包括字节流(PipedOutputStream 和 PipedInputStream)和字符流(PipedWriter 和 PipedReader)的使用方法,并给出具体的测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过管道进行线程间通信:字节流(PipedOutputStream,PipedInputStream)

Java中提供了各种各样的输入/输出流Stream,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。使用管道实现线程间的通信,不需要借助类似临时文件之类的东西。

测试代码:

public class WriteData {
	public void writeMethod(PipedOutputStream pos) {
		try {
			System.out.println("write :");
			for (int i = 0; i < 300; i++) {
				String outData = "" + (i + 1);
				pos.write(outData.getBytes());
				System.out.print(outData);
			}
			System.out.println();
			pos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
public class ReadData {
	public void readMethod(PipedInputStream pis){
		try{
			System.out.println("Read :");
			byte[] byteArray = new byte[20];
			int readLength = pis.read(byteArray);
			while(readLength != -1){
				String newData = new String(byteArray, 0, readLength);
				System.out.print(newData);
				readLength = pis.read(byteArray);
			}
			System.out.println();
			pis.close();
		}catch(IOException e){
			
		}		
	}
}
public class ThreadWrite extends Thread{
	private WriteData wd;
	private PipedOutputStream pos;
	public ThreadWrite(WriteData wd, PipedOutputStream pos) {
		super();
		this.wd = wd;
		this.pos = pos;
	}
	
	@Override
	public void run(){
		wd.writeMethod(pos);
	}
}
public class ThreadRead extends Thread{
	private ReadData rd;
	private PipedInputStream pis;
	public ThreadRead(ReadData rd, PipedInputStream pis) {
		this.rd = rd;
		this.pis = pis;
	}
	
	@Override
	public void run(){
		rd.readMethod(pis);
	}
}
public class RunTest {

	public static void main(String[] args) {
		try{
			WriteData wd = new WriteData();
			ReadData rd = new ReadData();
			PipedInputStream pis = new PipedInputStream();
			PipedOutputStream pos = new PipedOutputStream();
			pos.connect(pis);
			//pis.connect(pos);
			ThreadRead tr = new ThreadRead(rd, pis);
			tr.start();
			Thread.sleep(2000);
			ThreadWrite tw = new ThreadWrite(wd, pos);
			tw.start(); 
		}catch(IOException | InterruptedException e){
			e.printStackTrace();
		}
	}
}
运行结果:

Read :
write :
123456789101112123456789101....

读取线程启动后,由于还没数据写入,所以线程阻塞在read中,直到有数据写入,继续运行。


通过管道进行进程间通信:字符流(PipedWriter,PipedReader)

在管道中也可以传递字符流。

测试代码:

public class ReadData {
	public void readMethod(PipedReader pis){
		try{
			System.out.println("Read :");
			char[] byteArray = new char[20];
			int readLength = pis.read(byteArray);
			while(readLength != -1){
				String newData = new String(byteArray, 0, readLength);
				System.out.print(newData);
				readLength = pis.read(byteArray);
			}
			System.out.println();
			pis.close();
		}catch(IOException e){
			
		}		
	}
}

public class WriteData {
	public void writeMethod(PipedWriter pos) {
		try {
			System.out.println("write :");
			for (int i = 0; i < 300; i++) {
				String outData = "" + (i + 1);
				pos.write(outData);
				System.out.print(outData);
			}
			System.out.println();
			pos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
public class ThreadWrite extends Thread{
	private WriteData wd;
	private PipedWriter pos;
	public ThreadWrite(WriteData wd, PipedWriter pos) {
		super();
		this.wd = wd;
		this.pos = pos;
	}
	
	@Override
	public void run(){
		wd.writeMethod(pos);
	}
}
public class ThreadRead extends Thread{
	private ReadData rd;
	private PipedReader pis;
	public ThreadRead(ReadData rd, PipedReader pis) {
		this.rd = rd;
		this.pis = pis;
	}
	
	@Override
	public void run(){
		rd.readMethod(pis);
	}
}
public class RunTest {

	public static void main(String[] args) {
		try{
			WriteData wd = new WriteData();
			ReadData rd = new ReadData();
			PipedReader pis = new PipedReader();
			PipedWriter pos = new PipedWriter();
			pos.connect(pis);
			//pis.connect(pos);
			ThreadRead tr = new ThreadRead(rd, pis);
			tr.start();
			Thread.sleep(2000);
			ThreadWrite tw = new ThreadWrite(wd, pos);
			tw.start(); 
		}catch(IOException | InterruptedException e){
			e.printStackTrace();
		}
	}
}

运行结果也是一样的,两个线程可以通过管道进行字符数据的传输。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值