`

任务间使用管道输入输出

阅读更多

管道流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)

分享到:
评论

相关推荐

    example管道输入输出重定向

    在编程领域,尤其是在脚本编写中,管道输入输出重定向是一个非常关键的特性,它可以用来自动化处理大量数据,进行日志记录,或者在不同程序之间传递信息。理解并熟练掌握这一技术对于提升命令行操作和系统管理的效率...

    利用管道重定向cmd输入输出源码

    ### 利用管道重定向CMD输入输出的知识点详解 ...综上所述,通过API函数创建和使用管道来重定向CMD的输入输出是一项非常实用的技术,它不仅可以简化自动化任务的编写过程,还可以提高程序的性能和效率。

    Linux操作系统应用输入输出和管道

    通过这一系列操作,学生能够深入理解Linux中如何处理输入输出,以及如何使用管道连接不同命令。这不仅有助于理解Linux命令行的工作方式,也为解决更复杂的系统管理任务打下基础。在实际工作中,熟练掌握这些技能将极...

    Linux操作之输入输出重定向和管道

    ### Linux操作之输入输出重定向和管道 #### 标准输入输出与错误处理 在Linux或Unix环境下,标准输入(`stdin`)、标准输出(`stdout`)以及标准错误输出(`stderr`)是非常重要的概念。这三个流通常与控制终端关联...

    例程:将CMD的输入输出重定向到自己的进程

    总的来说,CMD的输入输出重定向和管道是Windows系统管理和自动化的重要工具。通过掌握这些技术,我们可以编写更加高效和灵活的批处理脚本,提高工作效率,同时也能更好地理解和控制系统的运行状态。

    Vxworks任务间通信

    管道允许一个任务的标准输出重定向到另一个任务的标准输入,常用于实现父子进程间的通信。 在开发VxWorks应用时,开发者需要根据具体需求和系统资源情况,选择合适的任务间通信机制。对于同步和互斥的需求,首选...

    进程间使用管道通信pipe.doc

    **管道**是一种特殊的文件,它用于连接两个进程,使得一个进程的标准输出成为另一个进程的标准输入。管道遵循先进先出(FIFO)的原则,即先进入管道的数据也会最先被读取出来。一旦数据被读取后,会自动从管道中删除...

    新输入输出NIO

    总的来说,新输入输出(NIO)为Java程序员提供了更高效、灵活的I/O操作手段,特别是对于处理大量数据和并发连接的系统,NIO的使用能够带来显著的性能提升。通过理解并熟练运用通道、缓冲区和选择器,开发者可以构建...

    进程间通信之管道通信

    4. **输入/输出操作**:使用`read()`和`write()`函数进行管道的数据读取和写入操作。 #### 四、应用场景 管道通信适用于简单的进程间数据传输场景,如本例中的文件读写过程。实际应用中,管道常用于连接多个程序,...

    VB利用DOS管道输出文本框

    DOS管道(Pipe)是一种通信机制,它允许我们将一个程序的输出作为另一个程序的输入,这里主要应用于将DOS命令的输出传递给VB应用程序。 首先,理解DOS管道的概念至关重要。在DOS或命令行环境中,管道符号`|`用于...

    linux 用法 │的用法 管道,将一个程序命令的输出作为另一个程序名称的输入

    在Linux操作系统中,管道符号“|”是一种非常重要的功能特性,它能够将一个命令的输出直接作为下一个命令的输入,从而实现高效的命令组合与数据处理流程。这种机制极大地提升了用户在进行复杂操作时的效率与灵活性。...

    Java实验6 输入输出流与文件操作.doc

    编程题是指使用Java中的输入输出流和文件操作实现具体的编程任务,例如使用文件字节输入、输出流读取文件,将一段文字加密后存入文件,然后再读取,并将加密前与加密后的文件输出。 3. 实验结果和分析 实验结果和...

    VC实现管道方式执行bat批处理输出获取

    管道是操作系统提供的一种进程间通信(IPC,Inter-Process Communication)机制,它允许一个进程的输出作为另一个进程的输入。在Windows系统中,有两种类型的管道:命名管道和匿名管道。在这个问题中,我们关注的是...

    VB通过管道技术捕捉dos的输出

    例如,可以使用Shell函数或System.Diagnostics.Process类来启动一个外部程序,并将管道作为其标准输入/输出。 - 为了捕获DOS命令的输出,VB程序需要保持管道打开状态,以便在命令执行过程中不断读取数据。 4. **...

    cmd中的重定向输出,管道

    管道操作符(`|`)是CMD中一个非常强大的功能,它允许将一个命令的输出作为另一个命令的输入。这可以极大地增强命令行的功能性和灵活性。基本语法如下: ```cmd 命令1 | 命令2 ``` 例如,使用`dir`命令列出目录...

    嵌入式系统中的进程间通信:深入管道与命名管道

    摘要: 进程间通信是嵌入式系统设计中的一个关键环节。...同时,也探讨了文件描述符的概念及其在IPC中的作用,介绍了dup()和dup2()系统调用的使用,以及它们在重定向标准输入输出中的应用。 对于命名管道,本文解

    标准输入输出及重定向PPT学习教案.pptx

    《标准输入输出及重定向详解》 在计算机操作系统中,标准输入输出是系统与用户交互的基础,而重定向则是提高命令行效率的关键技术。本文将深入解析标准输入、输出、错误输出及其重定向机制,帮助你更好地理解和运用...

    14-1-RHEL7-Linux+输入输出重定向

    在Linux系统中,输入输出重定向是一种强大的工具,它允许用户改变命令的标准输入输出的方向。这表示可以在命令执行过程中指定不同的输入源和输出目标,而不是仅仅依赖于键盘和显示器这两种标准设备。了解并掌握输入...

    Delphi7实现管道方式操作控制台

    标签中的“重定向”指的是将标准输入、输出和错误流(stdin, stdout, stderr)重定向到管道,这样我们的Delphi程序就能捕获cmd.exe的输出,同时也能向cmd.exe发送输入。 “控制台”和“DOS”在这里是指命令行环境,...

Global site tag (gtag.js) - Google Analytics