Thread--线程间通信--管道

在Java语言中提供了各种各样的输入/输出流Stream,使我们能够方便的对数据进行操作,其中管道流是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。

在Java的JDK中提供了4个类来使线程间可以进行通信:

  1)PipedInputStream和PipedOutputStream

  2)PipedReader和PipedWriter

 

1)PipedInputStream和PipedOutputStream

 1 package pipeInputOutput;
 2 
 3 import java.io.PipedOutputStream;
 4 
 5 public class WriteData {
 6     
 7     public void writeMethod(PipedOutputStream out) {
 8         try {
 9             System.out.println("write :");
10             for(int i=0; i<30000; i++) {
11                 String outData = "" + (i+1);
12                 out.write(outData.getBytes());
13                 System.out.print(outData);
14             }
15             System.out.println();
16             out.close();
17         } catch (Exception e) {
18             // TODO: handle exception
19             e.printStackTrace();
20         }
21     }
22 
23 }
 1 package pipeInputOutput;
 2 
 3 import java.io.PipedInputStream;
 4 
 5 public class ReadData {
 6     
 7     public void readMethod(PipedInputStream in) {
 8         try {
 9             byte[] byteArray = new byte[20];
10             int readLength = in.read(byteArray);
11             while(readLength != -1) {
12                 System.out.print("read :");
13                 String newData = new String(byteArray, 0, readLength);
14                 System.out.println(newData);
15                 readLength = in.read(byteArray);
16             }
17             System.out.println();
18             in.close();
19         } catch (Exception e) {
20             // TODO: handle exception
21             e.printStackTrace();
22         }
23     }
24 
25 }
 1 package pipeInputOutput;
 2 
 3 import java.io.PipedOutputStream;
 4 
 5 public class ThreadWrite extends Thread {
 6 
 7     private WriteData write;
 8     private PipedOutputStream out;
 9 
10     public ThreadWrite(WriteData write, PipedOutputStream out) {
11         super();
12         this.write = write;
13         this.out = out;
14     }
15 
16     @Override
17     public void run() {
18         write.writeMethod(out);
19     }
20     
21     
22 
23 }
 1 package pipeInputOutput;
 2 
 3 import java.io.PipedInputStream;
 4 
 5 public class ThreadRead extends Thread {
 6 
 7     private ReadData read;
 8     private PipedInputStream in;
 9 
10     public ThreadRead(ReadData read, PipedInputStream in) {
11         super();
12         this.read = read;
13         this.in = in;
14     }
15 
16     @Override
17     public void run() {
18         read.readMethod(in);
19     }
20 
21 }
 1 package pipeInputOutput;
 2 
 3 import java.io.PipedInputStream;
 4 import java.io.PipedOutputStream;
 5 
 6 public class Run {
 7     
 8     public static void main(String[] args) {
 9         try {
10             WriteData writeData = new WriteData();
11             ReadData readData = new ReadData();
12             
13             PipedInputStream inputStream = new PipedInputStream();
14             PipedOutputStream outputStream = new PipedOutputStream();
15             
16             outputStream.connect(inputStream);
17             
18 //            outputStream.write("hello world".getBytes());
19 //            byte[] bs = new byte[100];
20 //            int i = inputStream.read(bs);
21 //            System.out.println(new String(bs,0,i));
22             
23             ThreadRead threadRead = new ThreadRead(readData, inputStream);
24             threadRead.start();
25             
26             Thread.sleep(2000);
27             
28             ThreadWrite threadWrite = new ThreadWrite(writeData, outputStream);
29             threadWrite.start();
30         } catch (Exception e) {
31             // TODO: handle exception
32             e.printStackTrace();
33         }
34     }
35 
36 }

 

2)PipedReader和PipedWriter

 1 package pipeReaderWriter;
 2 
 3 import java.io.PipedWriter;
 4 
 5 public class WriteData {
 6     
 7     public void writeMethod(PipedWriter out) {
 8         try {
 9             System.out.println("write :");
10             for(int i=0; i<300; i++) {
11                 String outData = "" + (i+1);
12                 out.write(outData);
13                 System.out.println(outData);
14             }
15             System.out.println();
16             out.close();
17         } catch (Exception e) {
18             // TODO: handle exception
19             e.printStackTrace();
20         }
21     }
22 
23 }
 1 package pipeReaderWriter;
 2 
 3 import java.io.PipedReader;
 4 
 5 public class ReadData {
 6     
 7     public void readMethod(PipedReader in) {
 8         try {
 9             System.out.println("read:");
10             char[] byteArray = new char[20];
11             int readLength = in.read(byteArray);
12             while(readLength != -1) {
13                 String newData = new String(byteArray, 0, readLength);
14                 System.out.println(newData);
15                 readLength = in.read(byteArray);
16             }
17             System.out.println();
18             in.close();
19         } catch (Exception e) {
20             // TODO: handle exception
21             e.printStackTrace();
22         }
23     }
24 
25 }
 1 package pipeReaderWriter;
 2 
 3 import java.io.PipedWriter;
 4 
 5 public class ThreadWrite extends Thread {
 6 
 7     private WriteData write;
 8     private PipedWriter out;
 9 
10     public ThreadWrite(WriteData write, PipedWriter out) {
11         super();
12         this.write = write;
13         this.out = out;
14     }
15 
16     @Override
17     public void run() {
18         write.writeMethod(out);
19     }
20 
21 }
 1 package pipeReaderWriter;
 2 
 3 import java.io.PipedReader;
 4 
 5 public class ThreadRead extends Thread {
 6 
 7     private ReadData read;
 8     private PipedReader in;
 9 
10     public ThreadRead(ReadData read, PipedReader in) {
11         super();
12         this.read = read;
13         this.in = in;
14     }
15 
16     @Override
17     public void run() {
18         read.readMethod(in);
19     }
20 
21 }
 1 package pipeReaderWriter;
 2 
 3 import java.io.PipedReader;
 4 import java.io.PipedWriter;
 5 
 6 public class Run {
 7 
 8     public static void main(String[] args) {
 9         try {
10             WriteData writeData = new WriteData();
11             ReadData readData = new ReadData();
12             
13             PipedWriter out = new PipedWriter();
14             PipedReader in = new PipedReader();
15             
16             in.connect(out);
17             
18             ThreadRead threadRead = new ThreadRead(readData, in);
19             threadRead.start();
20             
21             Thread.sleep(2000);
22             
23             ThreadWrite threadWrite = new ThreadWrite(writeData, out);
24             threadWrite.start();
25             
26         } catch (Exception e) {
27             // TODO: handle exception
28         }
29     }
30     
31 }

 

posted @ 2017-02-06 14:58  MicroCat  阅读(441)  评论(0编辑  收藏  举报