【Java 多线程】Java 线程间通信,
分享于 点击 46209 次 点评:104
【Java 多线程】Java 线程间通信,
本文简单总结线程间通信的方式:
方法一:等待/通知机制
wait + notify + notifyAll的方式
方法二:通过管道进行线程间通信
使用Java给我们提供的管道流(pipeStream),在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据,
在Java 的JDK中提供了4个类来使线程间可以进行通信:
1)PipedInputStream 和 PipedOutputStream
2)PipedReader 和 PipedWriter
参考以下代码:
package study20170307;
import java.io.IOException;
import java.io.PipedInputStream;
/**
* Created by apple on 17/3/7.
*/
public class ReadData {
public void readMethod(PipedInputStream in){
try {
System.out.println("read:");
byte[] bytes = new byte[200];
int len = in.read(bytes);
while (len != -1){
String data = new String(bytes,0,len);
System.out.println(data);
len = in.read(bytes);
}
in.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
package study20170307;
import java.io.IOException;
import java.io.PipedOutputStream;
/**
* Created by apple on 17/3/7.
*/
public class WriteData {
public void writeMethod(PipedOutputStream out){
System.out.println("write:");
try {
for (int i = 0;i<30;i++){
out.write((""+ (i+1)).getBytes());
}
out.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
package study20170307;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
* Created by apple on 17/3/7.
*/
public class ReadThread extends Thread{
private ReadData readData;
private PipedInputStream inputStream;
public ReadThread(ReadData readData,PipedInputStream inputStream){
this.inputStream = inputStream;
this.readData = readData;
}
@Override
public void run() {
super.run();
readData.readMethod(inputStream);
}
}
package study20170307;
import java.io.PipedOutputStream;
/**
* Created by apple on 17/3/7.
*/
public class WriteThread extends Thread {
private WriteData writeData;
private PipedOutputStream outputStream;
public WriteThread(WriteData writeData,PipedOutputStream outputStream){
this.outputStream = outputStream;
this.writeData = writeData;
}
@Override
public void run() {
super.run();
writeData.writeMethod(outputStream);
}
}
package study20170307;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by apple on 17/3/7.
*/
public class Main {
public static void main(String[] args) {
ReadData readData = new ReadData();
WriteData writeData = new WriteData();
PipedInputStream inputStream = new PipedInputStream();
PipedOutputStream outputStream = new PipedOutputStream();
try {
outputStream.connect(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
ReadThread readThread = new ReadThread(readData,inputStream);
WriteThread writeThread = new WriteThread(writeData,outputStream);
writeThread.start();
readThread.start();
}
}
运行结果为:
相关文章
- 暂无相关文章
用户点评