通过管道进行线程通信-字节流:
1 import java.io.IOException; 2 import java.io.PipedInputStream; 3 4 /** 5 * PipedInputStream 6 */ 7 public class ReadData { 8 9 public void readMethod(PipedInputStream in) { 10 try { 11 System.out.println("read:"); 12 byte[] byteArray = new byte[20]; 13 14 int readLength = in.read(byteArray);//读取字节数组大小的数据到字节数组中 15 16 while (readLength != -1) { 17 String newData = new String(byteArray, 0, readLength); 18 System.out.print(newData); 19 readLength = in.read(byteArray); 20 } 21 System.out.println(); 22 in.close(); 23 } catch (IOException e) { 24 e.printStackTrace(); 25 } 26 } 27 }
1 import java.io.IOException; 2 import java.io.PipedOutputStream; 3 4 /** 5 * PipedOutputStream 6 */ 7 public class WriteData { 8 9 public void writeMethod(PipedOutputStream out) { 10 try { 11 System.out.println("write:"); 12 for (int i = 0; i < 300; i++) { 13 String outData = "" + (i+1); 14 out.write(outData.getBytes()); 15 System.out.print(outData); 16 } 17 System.out.println(); 18 out.close(); 19 } catch (IOException e) { 20 e.printStackTrace(); 21 } 22 } 23 }
1 import java.io.PipedInputStream; 2 3 /** 4 * 消费线程 5 */ 6 public class ThreadRead extends Thread { 7 8 private ReadData read; 9 private PipedInputStream in; 10 11 public ThreadRead(ReadData read,PipedInputStream in) { 12 this.read = read; 13 this.in = in; 14 } 15 16 @Override 17 public void run() { 18 read.readMethod(in); 19 } 20 }
1 import java.io.PipedOutputStream; 2 3 /** 4 * 生产线程 5 */ 6 public class ThreadWrite extends Thread { 7 8 private WriteData write; 9 private PipedOutputStream out; 10 11 public ThreadWrite(WriteData write,PipedOutputStream out) { 12 this.write = write; 13 this.out = out; 14 } 15 16 @Override 17 public void run() { 18 write.writeMethod(out); 19 } 20 }
1 import java.io.IOException; 2 import java.io.PipedInputStream; 3 import java.io.PipedOutputStream; 4 5 /** 6 * 线程通信测试类 7 */ 8 public class Run { 9 10 public static void main(String[] args) { 11 try { 12 WriteData write = new WriteData(); 13 ReadData read = new ReadData(); 14 15 PipedInputStream in = new PipedInputStream(); 16 PipedOutputStream out = new PipedOutputStream(); 17 18 out.connect(in); 19 20 ThreadRead threadRead = new ThreadRead(read,in); 21 threadRead.start(); 22 23 Thread.sleep(2000); 24 25 ThreadWrite threadWrite = new ThreadWrite(write,out); 26 threadWrite.start(); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 } catch (InterruptedException e) { 30 e.printStackTrace(); 31 } 32 } 33 }
运行结果如下:
可以看到消费线程启动后,目前没有数据,等待两秒后,生产线程提供数据,即write:下面的第一行数字,此时消费者线程获取到数据,打印最下面一行的数字。