管道流PipedReader和PipedWriter,它不同于普通的IO流,管道基本上是一个阻塞队列,且当线程对象调用shutdownNow之后,PipedReader是可中断的,而不通的IO是不可中断的。
==============向管道写任务==============
public class Sender implements Runnable{
private Random random=new Random(47);
private PipedWriter out=new PipedWriter();
public PipedWriter getPipedWriter(){
return out;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(true){
for(char c='A';c<='z';c++){
out.write(c);
System.out.println("Write:"+c);
TimeUnit.MILLISECONDS.sleep(random.nextInt(500));
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Sender writer exception");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("Sender interrupted.");
}
}
}
======================从管道读取任务
public class Receiver implements Runnable{
private PipedReader in;
public Receiver(Sender sender) {
// TODO Auto-generated constructor stub
try {
in=new PipedReader(sender.getPipedWriter());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(true){
System.out.println("Read:"+(char)in.read());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
======================测试类
public class PipedIO {
public static void main(String[] args) throws InterruptedException{
Sender sender=new Sender();
Receiver receiver=new Receiver(sender);
ExecutorService exec=Executors.newCachedThreadPool();
exec.execute(sender);
exec.execute(receiver);
TimeUnit.SECONDS.sleep(4);
exec.shutdownNow();
}
}
----------------执行结果如下:
Read:A
Write:A
Write:B
Write:C
Write:D
Write:E
Read:B
Read:C
Read:D
Read:E
Write:F
Write:G
Read:F
Read:G
Write:H
Write:I
Write:J
Write:K
Write:L
Write:M
Read:H
Read:I
Read:J
Read:K
Read:L
Read:M
Write:N
Write:O
Write:P
Write:Q
java.io.InterruptedIOException
Read:N
Read:O
Read:P
Read:Q
Sender interrupted.
at java.io.PipedReader.read(PipedReader.java:242)
at com.test.thread.pipe.Receiver.run(Receiver.java:24)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
分享到:
相关推荐
在编程领域,尤其是在脚本编写中,管道输入输出重定向是一个非常关键的特性,它可以用来自动化处理大量数据,进行日志记录,或者在不同程序之间传递信息。理解并熟练掌握这一技术对于提升命令行操作和系统管理的效率...
### 利用管道重定向CMD输入输出的知识点详解 ...综上所述,通过API函数创建和使用管道来重定向CMD的输入输出是一项非常实用的技术,它不仅可以简化自动化任务的编写过程,还可以提高程序的性能和效率。
通过这一系列操作,学生能够深入理解Linux中如何处理输入输出,以及如何使用管道连接不同命令。这不仅有助于理解Linux命令行的工作方式,也为解决更复杂的系统管理任务打下基础。在实际工作中,熟练掌握这些技能将极...
### Linux操作之输入输出重定向和管道 #### 标准输入输出与错误处理 在Linux或Unix环境下,标准输入(`stdin`)、标准输出(`stdout`)以及标准错误输出(`stderr`)是非常重要的概念。这三个流通常与控制终端关联...
总的来说,CMD的输入输出重定向和管道是Windows系统管理和自动化的重要工具。通过掌握这些技术,我们可以编写更加高效和灵活的批处理脚本,提高工作效率,同时也能更好地理解和控制系统的运行状态。
管道允许一个任务的标准输出重定向到另一个任务的标准输入,常用于实现父子进程间的通信。 在开发VxWorks应用时,开发者需要根据具体需求和系统资源情况,选择合适的任务间通信机制。对于同步和互斥的需求,首选...
**管道**是一种特殊的文件,它用于连接两个进程,使得一个进程的标准输出成为另一个进程的标准输入。管道遵循先进先出(FIFO)的原则,即先进入管道的数据也会最先被读取出来。一旦数据被读取后,会自动从管道中删除...
总的来说,新输入输出(NIO)为Java程序员提供了更高效、灵活的I/O操作手段,特别是对于处理大量数据和并发连接的系统,NIO的使用能够带来显著的性能提升。通过理解并熟练运用通道、缓冲区和选择器,开发者可以构建...
4. **输入/输出操作**:使用`read()`和`write()`函数进行管道的数据读取和写入操作。 #### 四、应用场景 管道通信适用于简单的进程间数据传输场景,如本例中的文件读写过程。实际应用中,管道常用于连接多个程序,...
DOS管道(Pipe)是一种通信机制,它允许我们将一个程序的输出作为另一个程序的输入,这里主要应用于将DOS命令的输出传递给VB应用程序。 首先,理解DOS管道的概念至关重要。在DOS或命令行环境中,管道符号`|`用于...
在Linux操作系统中,管道符号“|”是一种非常重要的功能特性,它能够将一个命令的输出直接作为下一个命令的输入,从而实现高效的命令组合与数据处理流程。这种机制极大地提升了用户在进行复杂操作时的效率与灵活性。...
编程题是指使用Java中的输入输出流和文件操作实现具体的编程任务,例如使用文件字节输入、输出流读取文件,将一段文字加密后存入文件,然后再读取,并将加密前与加密后的文件输出。 3. 实验结果和分析 实验结果和...
管道是操作系统提供的一种进程间通信(IPC,Inter-Process Communication)机制,它允许一个进程的输出作为另一个进程的输入。在Windows系统中,有两种类型的管道:命名管道和匿名管道。在这个问题中,我们关注的是...
例如,可以使用Shell函数或System.Diagnostics.Process类来启动一个外部程序,并将管道作为其标准输入/输出。 - 为了捕获DOS命令的输出,VB程序需要保持管道打开状态,以便在命令执行过程中不断读取数据。 4. **...
管道操作符(`|`)是CMD中一个非常强大的功能,它允许将一个命令的输出作为另一个命令的输入。这可以极大地增强命令行的功能性和灵活性。基本语法如下: ```cmd 命令1 | 命令2 ``` 例如,使用`dir`命令列出目录...
摘要: 进程间通信是嵌入式系统设计中的一个关键环节。...同时,也探讨了文件描述符的概念及其在IPC中的作用,介绍了dup()和dup2()系统调用的使用,以及它们在重定向标准输入输出中的应用。 对于命名管道,本文解
《标准输入输出及重定向详解》 在计算机操作系统中,标准输入输出是系统与用户交互的基础,而重定向则是提高命令行效率的关键技术。本文将深入解析标准输入、输出、错误输出及其重定向机制,帮助你更好地理解和运用...
利用管道流(`PipedInputStream`与`PipedOutputStream`)和Socket通信,Java程序可以实现进程间的数据传输,从而读写其他进程产生的数据。 通过深入理解Java IO的核心概念和常用类,开发者不仅能够高效地完成数据...
在Linux系统中,输入输出重定向是一种强大的工具,它允许用户改变命令的标准输入输出的方向。这表示可以在命令执行过程中指定不同的输入源和输出目标,而不是仅仅依赖于键盘和显示器这两种标准设备。了解并掌握输入...
在计算机科学领域,输入输出(I/O)是操作系统与用户、硬件或外部设备交互的关键机制。输入输出重定向是Linux和Unix-like系统中...在实际应用中,结合条件判断、循环等结构,输入输出重定向能实现更复杂的任务自动化。