通过PipedInputStream和PipedOutputStream方式可以实现线程间通信
现在看具体例子:
package com.vincent.pipe;
import java.io.PipedOutputStream;
/**
* Vincent 创建于 2016/5/13.
*/
public class Thread1 implements Runnable {
private PipedOutputStream outputStream;
public Thread1( PipedOutputStream outputStream) {
this.outputStream = outputStream;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(5000);
String s = String.valueOf(System.currentTimeMillis());
byte[] bytes = s.getBytes();
outputStream.write(bytes);
System.out.println("写入数据:"+s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
package com.vincent.pipe;
import java.io.PipedInputStream;
/**
* Vincent 创建于 2016/5/13.
*/
public class Thread2 implements Runnable {
private PipedInputStream inputStream;
public Thread2(PipedInputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public void run() {
try {
int length = -1;
byte[] bytes = new byte[1024];
//read方法会阻塞线程
while ((length = inputStream.read(bytes)) != -1) {
System.out.println("读取数据:" + new String(bytes, 0, length));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.vincent.pipe;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
* Vincent 创建于 2016/5/13.
*/
public class Main {
public static void main(String[] args) throws IOException {
PipedOutputStream outputStream=new PipedOutputStream();
PipedInputStream inputStream=new PipedInputStream();
inputStream.connect(outputStream);
Thread thread1=new Thread(new Thread1(outputStream));
Thread thread2=new Thread(new Thread2(inputStream));
thread1.start();
thread2.start();
}
}
输出:
写入数据:1463378999693
读取数据:1463378999693
写入数据:1463379004694
读取数据:1463379004694
写入数据:1463379009695
读取数据:1463379009695
通过以上例子,线程之间通过管道方式实现了通信