在主要功能..中不显示平均值。线程未激活,但未终止。为什么?

时间:2019-09-17 16:57:09

标签: java

我想创建一个程序来计算使用Java中的线程通过控制台输入的数字的平均值。在主函数中,我从未从getAverage()函数获得平均值的输出。怎么了..当我调试..程序终止但在正常运行时..当我输入除double值以外的任何内容时,它应该终止,但不会发生。

import java.util.*;
public class P1
{
    private AverageCalculator ac; 
    private boolean stop;

    public Thread inputThread,averageThread;

    public P1()
    {
        ac = new AverageCalculator();
        new UserInteraction(ac);
        new ToAverage(ac);
    }

    public void printAverage()
    {
        System.out.println("Average is " + ac.getAverage());
    }

    private class AverageCalculator{
        private double average=0,sum=0;
        private int i=0;
        private boolean flag=false;

        private double getAverage()
        {
            return average;
        }

        private synchronized void sum(double val) {
            while(flag) {
                try {
                    wait();
                } catch(InterruptedException e) { System.out.println("Thread Interrputed"); }
            }
            sum += val;
            i++;
            flag = true;
            notify();
        }

        private synchronized void calculateAverage()
        {
            while(!flag) {
                try {
                    wait();
                } catch(InterruptedException e) { System.out.println("thread interrupted"); }
            }
            average = (sum / i);
            flag = false;
            notify();
        }
    }

    private class UserInteraction implements Runnable {
        private AverageCalculator ac;
        //private boolean take=true;
        private double input=0;

        Scanner s = new Scanner(System.in);

        private UserInteraction(AverageCalculator ac) {
            this.ac = ac;
            inputThread = new Thread(this,"Input thread");
            inputThread.start();
            stop=false;
        }

        public void run()
        {
            System.out.println("Enter number: ");

            while(!stop) {
                if(s.hasNextDouble() == false) {
                    stop = true;
                    s.close();
                }
                else
                {

                    input = s.nextDouble();
                    s.nextLine();

                    ac.sum(input);

                }
            }
        }
    }

    private class ToAverage implements Runnable {
        private AverageCalculator ac;

        private ToAverage(AverageCalculator ac)
        {
            this.ac = ac;
            averageThread = new Thread(this,"Average doer Thread");
            averageThread.start();
        }

        public void run()
        {
            while(!stop) {

                ac.calculateAverage();
            }
        }
    }


public static void main(String[] args) {
        P1 p = new P1();
        try
        {
            p.inputThread.join();
            p.averageThread.join();
        } catch(InterruptedException e) { System.out.println("Interrupted in Main"); }
        System.out.println("Thread input alive check: " + p.inputThread.isAlive());
        System.out.println("Thread average alive check: " + p.averageThread.isAlive());
        p.printAverage();
    }
}

1 个答案:

答案 0 :(得分:0)

我没有完全调试您的代码,但是问题是您正在调用wait()。此方法将线程置于等待状态,必须进行对notify()notifyAll()的调用才能唤醒线程。

下面是对wait()方法被调用时发生的情况的恰当解释: Difference Between Wait and Sleep in Java