多线程编程之线程间的通信——管道通信
来源:互联网 发布:淘宝品类销售排行榜 编辑:程序博客网 时间:2024/06/05 02:50
上一章节讲了wait/notify通信,这一节我们来探讨使用管道进行通信。
java中提供了IO流使我们很方便的对数据进行操作,pipeStream是一种特殊的流,用于不同线程间直接传送数据。一个线程将数据发送到输出管道,另一个线程从输入管道读取数据。通过管道实现通信不需要借助临时文件这类东西。
java中提供了四个类使得线程间可以通信:
①字节流:PipeInputStream,PipedOutputStream
②字符流:PipedReader,PipedWriter
下面我们看看字节流的实现方法:
package pipeInputOutput;//输出流import java.io.IOException;import java.io.PipedOutputStream;public class WriteDate { public void writeMethod(PipedOutputStream out) { try { System.out.println("write:"); for(int i=0;i<300;i++) { String outDate=""+(i+1); out.write(outDate.getBytes()); System.out.print(outDate); } System.out.println(); out.close(); }catch(IOException e) { e.printStackTrace(); } }}package pipeInputOutput;//输入流import java.io.IOException;import java.io.PipedInputStream;public class ReadDate { public void ReadDate(PipedInputStream input) { try { System.out.println("read:"); byte[] byteArray=new byte[20]; int readLength=input.read(byteArray); while(readLength!=-1) { String newDate=new String(byteArray,0,readLength); System.out.print(newDate); readLength=input.read(byteArray); } System.out.println(); input.close(); }catch(IOException e){ e.printStackTrace(); } }}package pipeInputOutput;import java.io.PipedOutputStream;//输出线程public class ThreadWrite extends Thread { private WriteDate write; private PipedOutputStream out; public ThreadWrite(WriteDate write,PipedOutputStream out) { super(); this.write=write; this.out=out; } public void run() { write.writeMethod(out); }}package pipeInputOutput;import java.io.PipedInputStream;//输入线程public class ThreadRead extends Thread{ private ReadDate read; private PipedInputStream in; public ThreadRead(ReadDate read,PipedInputStream in) { super(); this.read=read; this.in=in; } public void run() { read.ReadDate(in); }}package pipeInputOutput;import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;//测试方法public class Run { public static void main(String[] args) { try { WriteDate write=new WriteDate(); ReadDate read=new ReadDate(); PipedInputStream inputStream=new PipedInputStream(); PipedOutputStream outputStream=new PipedOutputStream(); //输出流与输入流进行连接。 outputStream.connect(inputStream); //inputStream.connect(outputStream); ThreadRead readThread=new ThreadRead(read,inputStream); readThread.start();//先启动输出线程 Thread.sleep(2000); ThreadWrite writeThread=new ThreadWrite(write,outputStream); writeThread.start();//后启动输入线程 } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } }}控制台输出:read:write:123456789101112131415161718192021...123456789101112131415161718192021...
上面测试中,先启动输入线程,然后因为没有线程被写入所以线程被阻塞,知道有数据写入。
我们接着继续看看字符流的实现方法:
package pipeInputOutput1;import java.io.IOException;import java.io.PipedWriter;//字符输出流public class WriteDate { public void writeMethod(PipedWriter out) { try { System.out.println("write:"); for(int i=0;i<300;i++) { String outDate=""+(i+1); out.write(outDate); System.out.print(outDate); } System.out.println(); out.close(); }catch(IOException e) { e.printStackTrace(); } }}package pipeInputOutput1;import java.io.IOException;import java.io.PipedReader;//字符输入流public class ReadDate { public void readMethod(PipedReader in) { try { System.out.println("read:"); char[] byteArray=new char[20]; int readLength=in.read(byteArray); while(readLength!=-1) { String newDate=new String(byteArray,0,readLength); System.out.print(newDate); readLength=in.read(byteArray); } System.out.println(); in.close(); } catch (IOException e) { e.printStackTrace(); } }}package pipeInputOutput1;import java.io.PipedWriter;//输出流线程public class WriteThread extends Thread { private WriteDate write; private PipedWriter out; public WriteThread(WriteDate write,PipedWriter out) { super(); this.write=write; this.out=out; } public void run() { write.writeMethod(out); }}package pipeInputOutput1;import java.io.PipedReader;//输入流线程public class ReadThread extends Thread{ private ReadDate read; private PipedReader in; public ReadThread(ReadDate read,PipedReader in) { super(); this.read=read; this.in=in; } public void run() { read.readMethod(in); }}package pipeInputOutput1;import java.io.IOException;import java.io.PipedReader;import java.io.PipedWriter;//测试方法public class run { public static void main(String[] args) { try { WriteDate write=new WriteDate(); ReadDate read=new ReadDate(); PipedWriter out=new PipedWriter(); PipedReader in=new PipedReader(); //连接输出流与输入流 out.connect(in); //in.connect(out); ReadThread threadread=new ReadThread(read,in); threadread.start(); Thread.sleep(2000); WriteThread threadwrite=new WriteThread(write,out); threadwrite.start(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } }}
字符流额字节流大同小异,上面的例子中字符流不需要创建字节数组而已。
阅读全文
0 0
- 多线程编程之线程间的通信——管道通信
- 多线程编程之线程通信
- 多线程编程之线程间的通信——wait and notify
- 多线程 通过管道进行线程间通信
- 【Java编程】多线程之线程间的通信
- 黑马程序员——多线程之线程间的通信
- 黑马程序员——多线程之线程间的通信
- homework之线程之间的管道通信
- 多线程专题之线程间的通信
- java多线程之任务间管道通信
- 多线程编程浅析(2)——线程间通信
- 多线程编程浅析(2)——线程间通信
- 多线程编程浅析(2)——线程间通信
- Java多线程编程——线程间通信
- JAVA多线程之——线程之间的通信
- VC++多线程编程-线程间的通信和线程同步
- Java多线程编程3--通过管道线程间通信(字节流、字符流)
- 多线程编程实例----进程通信之命名管道
- 今天开通了CSDN的博客
- 瓦片地图setGlobalTileID无效
- struct stat结构体简介
- linux 学习系列-Linux 介绍
- Rust初识
- 多线程编程之线程间的通信——管道通信
- redis 消息发布订阅与消息队列
- 消除RGB受光照影响
- Android应用在未启动的情况下无法收到指定广播的问题总结
- HEVC学习(三) —— 帧内预测系列之一
- 可能是 Android 平台上最快的图片压缩框架
- BZOJ1079 着色方案(高维DP+神奇的状态)
- 教你如何从一个普通程序员,两年做到月薪 20 K+
- 重建smon_scn_time表和索引