上一章节讲了wait/notify通信,这一节我们来探讨使用管道进行通信。
java中提供了IO流使我们很方便的对数据进行操作,pipeStream是一种特殊的流,用于不同线程间直接传送数据。一个线程将数据发送到输出管道,另一个线程从输入管道读取数据。通过管道实现通信不需要借助临时文件这类东西。
java中提供了四个类使得线程间可以通信:
①字节流:PipeInputStream,PipedOutputStream
②字符流:PipedReader,PipedWriter
下面我们看看字节流的实现方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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(); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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(); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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...
上面测试中,先启动输入线程,然后因为没有线程被写入所以线程被阻塞,知道有数据写入。
我们接着继续看看字符流的实现方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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(); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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(); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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(); } } } |
字符流额字节流大同小异,上面的例子中字符流不需要创建字节数组而已。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/qq_39266910/article/details/78201810