30
Окт
2017

Многопоточная программа с "тяжелыми вычислениями"

В условии задания: релизовать многопоточную программу, которая будет вычислять число Пи с помощью ряда Лейбница: 4*(1-1/3+1/5-1/7+1/9-...). Отдельный поток в бесконечном цикле считает ряд, главный поток может его приостановить, показать текущий результат вычислений. Во время вычислений при каждом просмотре Пи значение должно становиться точнее и точнее.

Каждый раз Пи равно 4. Значение не меняется. Не могу сообразить в чем дело, помогите пожалуйста разобраться, буду признателен.

Вот здесь Пи считается:

public class PI implements Runnable {
private float PI=0;
private long Time;
private boolean StopCalculation = false;
private Thread thread;
PI(String name){
    thread = new Thread(this,name);
    thread.start();
}
@Override
public void run() {
    for (int i = 0; ;i++) {
        synchronized (thread) {
            long TMP = System.currentTimeMillis();
            PI = PI + ((float)(Math.pow(-1, i) * (1 / (2 * i + 1))));
            Time += System.currentTimeMillis() - TMP;
            while (StopCalculation)
                try {
                thread.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public long getTime() {
    return Time;
}
public float getPI() {
    return PI;
}
public void setStopProcess(boolean stopProcess) {
    StopCalculation = stopProcess;
}}

Здесь главная программа с меню:

import java.util.Scanner;
public class Menu implements  Runnable 
{
private int menu;
private Thread thread;
private PI pi;

Menu(String name, PI pi) 
{
    thread = new Thread(this, name);
    this.pi = pi;
    thread.start();
}

@Override
public void run() 
{
    while (true) 
    {
        synchronized (pi)
        {
            Scanner in = new Scanner(System.in);
            System.out.println("1 Продолжить вычисления.");
            System.out.println("2 Приостановить вычисления.");
            System.out.println("3 Посмотреть текущий результат.");
            System.out.println("4 Узнать суммарное время, затраченное на вычисления.");
            System.out.println("5 Выход.");
            menu = in.nextInt();
            switch (menu) 
            {
                case 1: 
                {
                    System.out.println("Продолжаем вычисления");
                    pi.notify();
                    pi.setStopProcess(false);
                    break;
                }
                case 2: {
                    System.out.println("Приостанавливаем вычисления");
                    pi.setStopProcess(true);
                    break;
                }
                case 3: 
                {
                    System.out.println("Полученное значение Пи: " + 4 * pi.getPI());
                    break;
                }
                case 4: 
                {
                    System.out.println("Время выполения" + pi.getTime());
                    break;
                }
                case 5: 
                {
                    System.out.println("");
                    System.exit(0);
                    break;
                }
                default: 
                {
                    System.out.println("<Error>");
                    break;
                }
            }
        }
    }
}}
public class Main 
{
    public static void main(String[] args) 
    {
    PI pi = new PI("Leibnits");
    Menu menu = new Menu("Menu",pi);
}}

Источник: https://ru.stackoverflow.com/questions/737988/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D0%B0%D1%8F-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D1%81-%D1%82%D1%8F%D0%B6%D0%B5%D0%BB%D1%8B%D0%BC%D0%B8-%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8

Тебе может это понравится...

Добавить комментарий