时间:2021-05-19
上一章节讲了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(); } }}控制台输出:
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(); } }}字符流额字节流大同小异,上面的例子中字符流不需要创建字节数组而已。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java多线程中线程间的通信一、使用while方式来实现线程之间的通信packagecom.ietree.multithread.sync;importjava
本文实例讲述了Java并发编程之常用的多线程实现方式。分享给大家供大家参考,具体如下:概述常用的多线程实现方式有2种:1. 继承Thread类2. 实现Runn
Android中子线程和UI线程之间通信的详细解释1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个类,那么他们之间的关系
java多线程之CyclicBarrier的使用方法publicclassCyclicBarrierTest{publicstaticvoidmain(Stri
一、java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题。java多线程,传统创建线程的方式有两种。1、继承自Thread