Java io线程退出_IO异常 – 读取结束死 – 在此示例中导致它的原因以及如何修复它 – Java中的多线程应用程序...

这是我在这里发布的

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();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值