• 技术文章 >Java >java教程

    Java多线程编之管道通信的实例分析

    黄舟黄舟2017-10-19 09:54:49原创1024
    这篇文章主要为大家详细介绍了java多线程编程之线程间的通信,探讨使用管道进行通信,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    上一章节讲了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();
      }
     }
    }

    字符流额字节流大同小异,上面的例子中字符流不需要创建字节数组而已。

    以上就是Java多线程编之管道通信的实例分析的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java 实例分析 通信
    上一篇:Java对一行英文进行单词提取功能的实现方法 下一篇:Java使用线程实现监控文件目录变化的方法
    php培训_php实战培训【立即报名】-php中文网第20期

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 完全掌握Java中的抽象类和接口• Java中的set集合如何理解• 详细了解java多线程机制• Java中的Object类知识点归纳• 一文掌握JAVA 面向对象之多态
    1/1

    PHP中文网