线程间的协作(3)——管道输入/输出流

简介: 参考资料《Java并发编程的艺术》《Java编程思想》《Java核心技术卷一》

1.管道输入/输出流类

    分为两类,字节流管道类(PipedInputStream/PipedOutputStream)和字符流管道类(PipedReader/ PipedWriter)。这两个IO流实现了可以在不同的任务中对同一个管道进行读写操作,这个模型可以看成是“生产者消-费者模式”的变体,管道是一个阻塞队列。

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PipedReader;
import java.io.PipedWriter;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class PipeIO {
	public static void main(String[] args) {
		ReadPipe read=new ReadPipe();
		WritePipe write=new WritePipe();
		ExecutorService exec=Executors.newCachedThreadPool();
		try {
			write.getWriter().connect(read.getRead());;//必须将两个管道进行连接,然后才可进行线程间的数据交互
			exec.execute(read);
			exec.execute(write);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
class ReadPipe implements Runnable{
	PipedReader read=new PipedReader();
	public PipedReader getRead(){
		return  read;
	}
	@Override
	public void run() {
		try {
			while(true){
				System.out.println("read:"+(char)read.read()+";");//当前线程从管道读取数据
			}	
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
}
class WritePipe implements Runnable{
	PipedWriter writer=new PipedWriter();
	public PipedWriter getWriter(){
		return  writer;
	}
	@Override
	public void run() {
		try {
			while(true){
				for(char a='A';a<='z';a++){
					writer.write(a);//当前线程向管道输出数据
					TimeUnit.SECONDS.sleep(2);
				}
			}	
		} catch (IOException e) {
			// TODO: handle exception
		}catch (InterruptedException e) {
			// TODO: handle exception
		}
	}
}

 

相关文章
|
6月前
|
Java 开发者
多线程编程范式(一) 协作范式
多线程编程范式(一) 协作范式
|
6月前
|
数据处理
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
66 1
|
3月前
|
Java 开发者
解锁并发编程新姿势!深度揭秘AQS独占锁&ReentrantLock重入锁奥秘,Condition条件变量让你玩转线程协作,秒变并发大神!
【8月更文挑战第4天】AQS是Java并发编程的核心框架,为锁和同步器提供基础结构。ReentrantLock基于AQS实现可重入互斥锁,比`synchronized`更灵活,支持可中断锁获取及超时控制。通过维护计数器实现锁的重入性。Condition接口允许ReentrantLock创建多个条件变量,支持细粒度线程协作,超越了传统`wait`/`notify`机制,助力开发者构建高效可靠的并发应用。
89 0
|
4月前
|
安全 Java API
Java并发编程的艺术:解锁多线程同步与协作的秘密
【7月更文挑战第28天】在Java的世界中,并发编程如同一场精心编排的交响乐,每一个线程都是乐团中的乐手,而同步机制则是那指挥棒,确保旋律的和谐与统一。本文将深入探讨Java并发编程的核心概念,包括线程的创建、同步机制、以及线程间的通信方式,旨在帮助读者解锁Java多线程编程的秘密,提升程序的性能和响应性。
43 3
|
4月前
|
安全 Java 数据处理
Java并发编程:线程同步与协作的深度解析
在探索Java并发编程的海洋中,线程同步与协作的灯塔指引着航向。本文将深入挖掘线程同步机制的核心原理,揭示锁、条件变量等工具如何确保数据的一致性和线程间有序的通信。通过案例分析,我们将解码高效并发模式背后的设计哲学,并探讨现代Java并发库如何简化复杂的同步任务。跟随文章的步伐,您将获得提升多线程应用性能与可靠性的关键技能。 【7月更文挑战第24天】
43 5
|
6月前
|
Java
Java一分钟:线程协作:wait(), notify(), notifyAll()
【5月更文挑战第11天】本文介绍了Java多线程编程中的`wait()`, `notify()`, `notifyAll()`方法,它们用于线程间通信和同步。这些方法在`synchronized`代码块中使用,控制线程执行和资源访问。文章讨论了常见问题,如死锁、未捕获异常、同步使用错误及通知错误,并提供了生产者-消费者模型的示例代码,强调理解并正确使用这些方法对实现线程协作的重要性。
62 3
|
Java 数据处理 调度
Java线程并发协作与任务定时调度
Java线程并发协作与任务定时调度
89 1
|
存储 Java 调度
《Java-SE-第二十四章》之线程间协作
《Java-SE-第二十四章》之线程间协作
|
算法 Java
线程通过管道通信
线程通过管道通信
|
Go C++
通过哲学家进餐问题学习线程间协作(代码实现以leetcode1226为例)
通过哲学家进餐问题学习线程间协作(代码实现以leetcode1226为例)
124 0