zoukankan      html  css  js  c++  java
  • java线程间通信之通过管道进行通信

    管道流PipeStream是一种特殊的流,用于在不同线程间直接传送数据,而不需要借助临时文件之类的东西。

    jdk中提供了四个类来使线程间可以通信:

    1)PipedInputStream和PipedOutputStream

    2)PipedReader和PipedWriter

    先看看字节流的示例:

     1 public class ReadData {
     2     
     3     public void readMethod(PipedInputStream in) throws IOException{
     4         System.out.println("begin read...");
     5         byte[] b = new byte[20];
     6         int readLength = in.read(b);
     7         while (readLength != -1) {
     8             String newData = new String(b, 0, readLength);
     9             System.out.println("read:"+newData);
    10             readLength = in.read(b);
    11         }
    12         in.close();
    13         System.out.println("end read...");
    14     }
    15 
    16 }
     1 public class WriteData {
     2 
     3     public void writeMethod(PipedOutputStream out) throws IOException{
     4         System.out.println("begin write...");
     5         for (int i = 0; i < 10; i++) {
     6             out.write((""+i).getBytes());
     7             System.out.println("write:"+i);
     8         }
     9         out.close();
    10         System.out.println("end write...");
    11     }
    12 }
     1 public class ThreadRead extends Thread {
     2     
     3     private ReadData readData;
     4     private PipedInputStream in;
     5 
     6     public ThreadRead(ReadData readData, PipedInputStream in) {
     7         this.readData = readData;
     8         this.in = in;
     9     }
    10     
    11     @Override
    12     public void run() {
    13         try {
    14             readData.readMethod(in);
    15         } catch (IOException e) {
    16             e.printStackTrace();
    17         }
    18     }
    19 }
     1 public class ThreadWrite extends Thread {
     2     
     3     private WriteData writeData;
     4     private PipedOutputStream out;
     5     
     6     public ThreadWrite(WriteData writeData, PipedOutputStream out) {
     7         this.writeData = writeData;
     8         this.out = out;
     9     }
    10 
    11     @Override
    12     public void run() {
    13         try {
    14             writeData.writeMethod(out);
    15         } catch (IOException e) {
    16             e.printStackTrace();
    17         }
    18     }
    19 }
     1 public class Run {
     2     public static void main(String[] args) throws IOException, InterruptedException {
     3         WriteData writeData = new WriteData();
     4         ReadData readData = new ReadData();
     5         
     6         PipedOutputStream out = new PipedOutputStream();
     7         PipedInputStream in = new PipedInputStream();
     8         
     9         in.connect(out);
    10         
    11         new ThreadWrite(writeData, out).start();
    12         Thread.sleep(2000);
    13         new ThreadRead(readData, in).start();
    14     }
    15 }

    再看看字符流示例:

     1 public class ReadData {
     2     
     3     public void readMethod(PipedReader reader) throws IOException{
     4         System.out.println("begin read...");
     5         char[] c = new char[20];
     6         int readLength = reader.read(c);
     7         while (readLength != -1) {
     8             String newData = new String(c, 0, readLength);
     9             System.out.println("read:"+newData);
    10             readLength = reader.read(c);
    11         }
    12         reader.close();
    13         System.out.println("end read...");
    14     }
    15 
    16 }
     1 public class WriteData {
     2 
     3     public void writeMethod(PipedWriter writer) throws IOException{
     4         System.out.println("begin write...");
     5         for (int i = 0; i < 10; i++) {
     6             writer.write((""+i));
     7             System.out.println("write:"+i);
     8         }
     9         writer.close();
    10         System.out.println("end write...");
    11     }
    12 }
     1 public class ThreadRead extends Thread {
     2     
     3     private ReadData readData;
     4     private PipedReader reader;
     5 
     6     public ThreadRead(ReadData readData, PipedReader reader) {
     7         this.readData = readData;
     8         this.reader = reader;
     9     }
    10     
    11     @Override
    12     public void run() {
    13         try {
    14             readData.readMethod(reader);
    15         } catch (IOException e) {
    16             e.printStackTrace();
    17         }
    18     }
    19 }
     1 public class ThreadWrite extends Thread {
     2     
     3     private WriteData writeData;
     4     private PipedWriter writer;
     5     
     6     public ThreadWrite(WriteData writeData, PipedWriter writer) {
     7         this.writeData = writeData;
     8         this.writer = writer;
     9     }
    10 
    11     @Override
    12     public void run() {
    13         try {
    14             writeData.writeMethod(writer);
    15         } catch (IOException e) {
    16             e.printStackTrace();
    17         }
    18     }
    19 }
     1 public class Run {
     2     public static void main(String[] args) throws IOException, InterruptedException {
     3         WriteData writeData = new WriteData();
     4         ReadData readData = new ReadData();
     5         
     6         PipedWriter writer = new PipedWriter();
     7         PipedReader reader = new PipedReader();
     8         
     9         writer.connect(reader);
    10         
    11         new ThreadWrite(writeData, writer).start();
    12         Thread.sleep(2000);
    13         new ThreadRead(readData, reader).start();
    14     }
    15 }

  • 相关阅读:
    MySQL-EXPLAIN执行计划字段解释
    MySQL-EXPLAIN执行计划Extra解释
    HTTP与HTTPS的区别
    【面试】Java中sleep和wait的区别
    Nginx之前后端分离(入门)
    玩程序 之 一 . 字符串处理工具(可通过C#脚本扩展)
    C#实现下载功能,可用于软件自动更新
    对c#剪切板Clipboard占用的问题一点解决方法
    C# 制作 仪表
    C#使用自定义字体(从文件获取)
  • 原文地址:https://www.cnblogs.com/shamo89/p/6674055.html
Copyright © 2011-2022 走看看