Java 中利用管道实现线程间的通讯

2016-02-19 14:38 7 1 收藏

今天图老师小编要向大家分享个Java 中利用管道实现线程间的通讯教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

在Java 语言中,提供了各种各样的输入输出流(stream),使我们能够很方便的对数据进行操作,其中,管道(pipe)流是一种非凡的流,用于在不同线程(threads)间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通讯。!-- frame contents -- !-- /frame contents --无需求助于类似临时文件之类的东西。本文在简要介绍管道的基本概念后,将以一个具体的实例pipeapp加以具体说明。

  1.管道的创建与使用
  

  Java提供了两个非凡的专门的类专门用于处理管道,它们就是pipedinputstream类和pipeoutputstream类。
  
  Pipedinputstream代表了数据在管道中的输出端,也就是线程向管道读数据的一端;pipeoutputstream代表了数据在管道中的输入端,也就是线程向管道写数据的一端,这两个类一起使用可以提供数据的管道流。
  
  为了创建一个管道流,我们必须首先创建一个pipeoutstream对象,然后,创建pipeinputstream对象,实例如下:
  
  pipeout= new pipedyoutstream();
  pipein= new pipedputsteam(pipepout);
  
  一旦创建了一个管道后,就可以象操作文件一样对管道进行数据的读写。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  2.演示程序: pipeapp
  
  应用程序由三个程序组成:主线程(pipeapp.Java)及由主线程启动的两个二级线程(ythread.Java和zthread.Java),它们使用管道来处理数据。程序从一个内容为一行一行"x"字母的"input.txt"文件中读取数据,使用管道传输数据,第一次是利用线程ythread将数据"x"转换为"y",最后利用线程zthread将"y"转换为"z",之后,程序在屏幕上显示修改后的数据。
  
  主线程 (pipeapp.Java)
  
  在main()方法中,程序首先创建一个应用对象:pipeapp pipeapp=new pipeapp();
  
  由于程序中流操作都需要使用IOException异常处理,所以设置了一个try块。在try中,为了从源文件中读取数据,程序为"input.txt"文件创建了一个输入流Xfileln,:
  
  fileinputstream xfileln= new fileinputstream("input.txt");
  
  新的输入流传递给changetoy()方法,让线程ythread能读取该文件:
  
  inputstream ylnpipe =pipeapp.changetoy(xfileln);
  
  changetoy()方法创建将输入数据"x"改变到"y"的线程ythread,并返回该线程的输入管道:
  
  inputstream zlnpipe = pipeapp.changetoz(ylnpipe);
  
  changetoz()方法启动将数据从"y"改变到"z"的线程zehread,主程序将使用从changetoz()返回的输入管道。得到以修改的数据。
  
  然后,程序将管道输入流定位到datainputstream对象,使程序能够使用readline()方法读取数据:
  datainputstream inputstream = new datainputstream(zlnpiepe);
  
  创建了输入流以后,程序就可以以行一行的读取数据病显示在屏幕上。
  

  String str= inputstream.readline();
  While(str!=null)
  {
  system.out.println(str);
  str=inputstream.readline();
  }

  显示完成之后,程序关闭输入流:
  

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)  inputstream.close();
  changetoy()方法

  changetoy()方法首先通过传递一个参数inputstream给datainputstream对象来定位资源的输入流,使程序能使用readline()方法从流中读取数据:
  
  datainputstream xfileln =new datainutstream(inputstream);
  
  然后,changetoy()创建输出管道和输入管道:
  

  pipeoutstream pipeout = new pipeoutputstream();
  pipeinputstream pipeln = new pipedinputsteam(pipeout);

  为了能够使用println()方法输出修改的后的文本行到管道,程序将输出管道定位到printstream对象:
  
  printstream printstream = new printstream(pipeout);
  
  现在,程序可以创建将数据从x改变到y的线程,该线程是ythread类的一个对象,他传递两个参数:输入文件(xfileln)和输出管道(调用printstream)
  
  ythread ythread =new thread(xfileln,printstream);
  
  之后,程序启动线程:
  
  changetoz()方法
  
  changetoz()方法与changetoy()方法很相似,他从changetoy()返回的输入流开始:
  

来源:http://www.tulaoshi.com/n/20160219/1607394.html

延伸阅读
在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通过这些方法,我们可以对线程进行方便的操作,但是这些方法中,只有start()方法得到了保留。 在Sun公司的一篇文章《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中详细讲...
管道技术一般采用Window API来实现,最近我试着用C#来实现Windows管道技术,发现C#本身方便的进程线程机制使工作变得简单至极,随手记录一下,推荐给大家。 首先,我们可以通过设置Process类,获取输出接口,代码如下: Process proc = new Process();proc .StartInfo.FileName = strScript;proc .StartInfo.WorkingDirectory =...
数据报(Datagram)使网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的、独立的、自身包含地址信息的消息,它能否到达目的地,到达的时间,到达时内容是否会变化不能准确知道的。!-- frame contents -- !-- /frame contents --它的通讯双方是不需要建立连接的,对于一些不需要很高质量的应用程序来说,数据报...
在Java中使用JCOM和JXL注重要点: (1)在你的lib下要有jdom-1.0.jar,jxl-2.5.5.jar,jcom-2.2.4.jar,jcom.dll。 (2)要把jcom.dll同时放到你JDK的bin目录下或者放到系统盘的windows下(推荐放到JDK的BIN下) 把上面的JAR包都放好后开始写应用中的工具类(申明一下在JCOM中得到的都是IDispatch对象,以下还会抛...
 C# 中的“事件”是当对象满足一定条件,发生某些事情时,类向该类的客户提供通知的一种方法。使用事件,拥有该事件的对象不必知道需要通知谁,一旦满足了某个条件,将自动调用该事件,正确通知每个需要通知的对象。通过使用事件,提高了程序的模块化程度。  要在程序中使用自定义事件,需按以下步骤进行: 1、声明事件要在类内...

经验教程

144

收藏

45
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部