java - 如何在Java多线程中从线程2设置线程1的 boolean 标志

标签 java multithreading boolean flags

我正在编写一个涉及三个线程的简单multithreaded应用程序:Thread-1Thread-2main
Thread-1random number生成器类,它生成random doubles并馈给Thread-2
Thread-2会消耗这些数字来计算平均值。我使用了PipedOutputStreamThread-1一起提供的random numbersThread-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-2isDone设置为false。

关于java - 如何在Java多线程中从线程2设置线程1的 boolean 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22180458/

相关文章:

python - Gunicorn:多个后台工作线程

java - 我可以用 Guava 将文本换行到给定的宽度吗?

java - Glassfish 5 不适用于 Intellij 2017 2.4

java - 使用 Guice 从其他库注入(inject)父类

c++ - 确保创建线程并在广播前等待

java - 有没有一种方法可以让多个线程添加到同一个列表对象?

java - 具有对象类型值的映射中的强制转换异常问题

mysql - mysql 查询是否有可能返回真/假而不是值?

c#:编写 v1 的更短方式! ? v2 : !v2

java - 如何在 El Capitan (OS X 10.11) 中设置 Android Studio?