这是我在这里发布的
extension问题,虽然这似乎解决了我的问题的一部分,现在我看到IO-Exception读取结束死亡异常.我使用的是多线程应用程序,其中thread-1生成随机数,而其他thread-2使用它来计算平均值.一旦平均值达到阈值,我发信号通知线程1停止产生数字.这是代码的基本设计.
我得到IO-Exception read end dead exception.我想知道为什么会这样,以及如何解决它.
谢谢.
代码如下:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
//
class NumGen extends Thread {
PipedOutputStream pos;
DataOutputStream dos;
AtomicBoolean isDone;
public NumGen(PipedOutputStream pos,AtomicBoolean isDone){
this.pos=pos;
dos=new DataOutputStream(pos);
this.isDone=isDone;
}
public void run(){
while (!isDone.get()){
Random rand = new Random();
try {
dos.writeDouble(rand.nextDouble()+100.0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class RunningAvg extends Thread {
PipedInputStream pis;
DataInputStream dis;
Double avg;
int count;
Double runningTotal;
AtomicBoolean isDone;
public RunningAvg(PipedInputStream pis,AtomicBoolean isDone){
this.pis=pis;
dis=new DataInputStream(pis);
runningTotal=0.0;
avg=0.0;
this.isDone=isDone;
}
public void run(){
try {
while (dis.available()>0){
count+=1;
runningTotal+=dis.readDouble();
avg=runningTotal/count;
System.out.printf("The average in count no : %s is %s%n",count,avg);
if (avg>1E5)
isDone.set(true);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class InterThreadComm {
public static void main(String[] args){
try {
PipedOutputStream pos= new PipedOutputStream();
PipedInputStream pis = new PipedInputStream(pos);
AtomicBoolean isDone = new AtomicBoolean(false);
NumGen ng = new NumGen(pos,isDone);
RunningAvg ra = new RunningAvg(pis,isDone);
ng.start();
ra.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
编辑:
根据以下答案:我尝试使用try-with-resources关闭Streams.但我明白了
java.io.IOException:管道已关闭
public class InterThreadComm {
public static void main(String[] args){
try(PipedOutputStream pos= new PipedOutputStream();PipedInputStream pis =new PipedInputStream(pos)){
AtomicBoolean isDone = new AtomicBoolean(false);
NumGen ng = new NumGen(pos,isDone);
RunningAvg ra = new RunningAvg(pis,isDone);
ng.start();
ra.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}