欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【Java多线程】使用多线程计算阶乘累加 1!+2!+3!+...+19!+20!。其中一个线程计算阶乘,另一线程实现累加并输出结果

程序员文章站 2022-04-21 19:21:16
使用多线程计算阶乘累加 1!+2!+3!+…+19!+20!。其中一个线程计算阶乘,另一线程实现累加并输出结果。(最后结果可能存在问题,但是我不知道怎么改)class Info{ double sum=1; double count =0; private boolean flag=false; public synchronized void set(int sum ,int count){ if(flag){ try{...

(如发现问题,请帮忙指出,谢谢)使用多线程计算阶乘累加 1!+2!+3!+…+19!+20!。其中一个线程计算阶乘,另一线程实现累加并输出结果。

class Info{
    double sum=1;
    double count =0;
    private boolean flag=false;
    double count1;
    public synchronized void set(double sum){
        if(!flag){
            try{
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.setSum(sum);
        try{
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.setCount(count);
        flag=false;
        super.notify();
    }
    public synchronized void get(double count){
        if(flag){
            try{
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try{
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag=true;
        super.notify();
    }

    public double getCount() {
        return count;
    }

    public void setCount(double count) {
        this.count = count;
    }

    public void setSum(double sum) {
        this.sum = sum;
    }

    public double getSum() {
        return sum;
    }
}

class Producer implements Runnable {
    private Info info = null;
    public Producer(Info info) {
        this.info = info;
    }

    @Override
    public void run() {
        int i;
        boolean flag = true;
        if (flag) {
            for (i = 1; i <= 20; i++) {
                try {
                    this.info.sum=1;
                    for (int j = 1; j <= i; j++) {
                        this.info.sum *= j;
                        if(i==20){
                            this.info.count1=this.info.sum;
                        }
                    }
                    Thread.sleep(90);
                    System.out.println(i + "!为" + this.info.sum);
                    this.info.set(this.info.sum);
                }catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            flag=true;
        }else {
            try{
                Thread.sleep(90);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            flag=false;
        }
    }
}

class Consumer implements Runnable{
    private Info info=null;
    private double count1=0;
    public Consumer(Info info){
        this.info=info;
    }
    @Override
    public void run() {
        for(int i=1;i<=20;i++){      
            try{
                Thread.sleep(100);
                this.info.count+=this.info.sum;
                this.info.get(this.info.count);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("计算结果为:"+(this.info.count+this.info.count1));
    }
}

public class TestX {
    public static void main(String args[]){
        Info i=new Info();
        Producer pro=new Producer(i);
        Consumer con=new Consumer(i);
        new Thread(pro).start();
        new Thread(con).start();
    }
}

本文地址:https://blog.csdn.net/qq_50816920/article/details/109896045