我正在编写一个涉及三个线程的简单multithreaded
应用程序:Thread-1
,Thread-2
和main
。Thread-1
是random number
生成器类,它生成random doubles
并馈给Thread-2
。Thread-2
会消耗这些数字来计算平均值。我使用了PipedOutputStream
与Thread-1
一起提供的random numbers
。 Thread-2
使用PipedInputStream
吞噬了random numbers
。
问题是::
如果Thread-2
中的平均值超过1E5,我想发信号Thread-1
停止产生数字。我在boolean flag
中有一个Thread-1
,需要将其打开。我怎样才能做到这一点?
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.Random;
//
class NumGen extends Thread {
PipedOutputStream pos;
DataOutputStream dos;
boolean isDone=false;
public NumGen(PipedOutputStream pos){
this.pos=pos;
dos=new DataOutputStream(pos);
}
public void run(){
while (!isDone){
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;
public RunningAvg(PipedInputStream pis){
this.pis=pis;
dis=new DataInputStream(pis);
runningTotal=0.0;
avg=0.0;
}
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
//set NumGen.isDone=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);
NumGen ng = new NumGen(pos);
RunningAvg ra = new RunningAvg(pis);
ng.start();
ra.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
PS:该代码将永久运行,而无需在控制台上打印任何内容,我至今仍未弄清楚原因!!
最佳答案
您可以使用AtomicBoolean
并将其传递给两个线程,Atomic类型是可访问的,抛出多线程也是线程安全的。
首先声明您将isDone
标记为AtomicBoolean
private AtomicBoolean isDone;
然后声明一个
AtomicBoolean
对象并将其传递给两个线程PipedOutputStream pos= new PipedOutputStream();
PipedInputStream pis = new PipedInputStream(pos);
AtomicBoolean isDone = new AtomicBoolean();
NumGen ng = new NumGen(pos, isDone);
RunningAvg ra = new RunningAvg(pis, isDone);
ng.start();
ra.start();
最后,一旦您想停止生成数字,请询问
Thread-2
将isDone
设置为false。
关于java - 如何在Java多线程中从线程2设置线程1的 boolean 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22180458/