Я пишу простое приложение 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
.
Вопрос в том::
если среднее значение превышает 1E5 в Thread-2
, я хочу подать сигнал 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: код работает вечно, ничего не печатая на консоли, и я еще не понял, почему!!
interrupt()
в первом потоке и правильно обработать прерывание. - person ferrerverck   schedule 04.03.2014thread-1
изthread-2
. пожалуйста, покажите, как этого добиться? - person brain storm   schedule 04.03.2014