当前位置: 首页 > 面试题库 >

如何在Java多线程中从线程2设置线程1的布尔标志

尚安平
2023-03-14
问题内容

我写一个简单的multithreaded应用程序,它涉及三个线程: Thread-1Thread-2main

Thread-1生成* 并馈给的random number生成器类。 *random doubles``Thread-2

Thread-2 消耗了 计算平均值。我的号码已经使用PipedOutputStreamThread-1饲料用random numbersThread-2用途PipedInputStream吃起来random numbers

问题是::

如果平均值超过中的1E5 Thread-2,我想Thread-1表示停止产生数字。我有一个boolean flagThread-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并将它传递给两个线程,原子类型是可访问的,抛出多线程也是线程安全的。

首先声明您标记isDoneAtomicBoolean

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设置isDonefalse。



 类似资料:
  • 我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢

  • 问题内容: 我已经成功设置了Spring Batch项目教程。我真的很想知道是否有可能在“ Spring级别”使它成为多线程的。 我想要的基本思想是列出任务或任务步骤的列表,并让它们由独立的线程拾取和处理,理想情况下是从限制为“ n”个线程的池中进行。 这可能吗?如果是这样,怎么办?有人可以引导我到我目前所在的位置吗? 简单的项目我是从本教程在这里。它基本上具有不同的任务,这些任务将消息打印到屏幕

  • 我是多线程的新手,当我阅读有关多线程的内容时,我想编写这个精美的多线程代码来执行以下操作。 我的柜台类如下。 这个计数器对象由两个线程共享。一旦线程启动,我需要做以下事情。我希望Thread2一直等到Thread1将Counter对象的计数加1。完成后,线程1通知线程2,然后线程1开始等待线程2将值递减1。然后,线程2启动并将值递减1,并再次通知线程1,然后线程2开始等待线程1。重复这个过程几次。

  • 本文向大家介绍在C#中如何从线程中获取线程ID,包括了在C#中如何从线程中获取线程ID的使用技巧和注意事项,需要的朋友参考一下 线程被定义为程序的执行路径。每个线程定义唯一的控制流。如果您的应用程序涉及复杂且耗时的操作,那么设置不同的执行路径或线程(每个线程执行一个特定的工作)通常会很有帮助。 线程是轻量级进程。使用线程的一个常见示例是现代操作系统对并发编程的实现。使用线程可以节省CPU周期,并提

  • 这是一个关于Java中多线程的初学者问题。 根据我的理解,当创建多个(用户)线程来运行程序或应用程序时,就没有父线程和子线程的概念。它们都是独立的用户线程。 因此,如果主线程完成执行,那么另一个线程(Thread2)仍将继续执行,因为在Thread2的执行线程完成之前,它不会被JVM杀死(https://docs.oracle.com/javase/6/docs/api/java/lang/Thr

  • 多线程。在这种模式下,SQLite可以安全地由多个线程使用,前提是在两个或多个线程中不同时使用单个数据库连接。 序列化。在序列化模式下,SQLite可以安全地由多个线程使用,不受限制。