Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 4
1

Решение квадратного уравнения через потоки

26.11.2018, 13:13. Показов 3340. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите, пожалуйста, написать код для расчета корней квадратного уравнения через несколько потоков. Мне задали сделать код для курсовой по теме с многопоточным программированием, а что это и как оно работает никто так и не объяснил
Из самой джавы знаю только базовые основы, но готова разобраться полностью, что и как работает в коде. Я пыталась разобраться в теме потоков, но за пару недель невозможно все это впихнуть себе в голову
Так что очень сильно прошу вашей помощи, даже если хотя бы примерно объясните, что, как и куда делать. Спасибо!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2018, 13:13
Ответы с готовыми решениями:

Решение квадратного уравнения через теорему Виета
Сделайте программу решающую квадратное уравнение через теорему Виета: x^2+4x+2=0 v1=x1+x2=-b...

Решение квадратного уравнения
Подскажите пожалуйста!!!Правильно ли написан код квадратного уравнения работая с консолью или можно...

Решение квадратного уравнения
Решить квадратное уравнение. Ввод коэффициентов организовать с помощью диалогового окна. По...

Решение квадратного уравнения
Здравствуйте, уважаемые жители форума. Помогите решить задание, не пускает правильные решения и...

8
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
26.11.2018, 14:37 2
зачем считать корни квадратного уравнения в несколько потоков?
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 4
26.11.2018, 15:28  [ТС] 3
Задание для курсовой такое
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
26.11.2018, 15:37 4
вероятно, ты что-то неверно понимаешь
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
26.11.2018, 18:49 5
Цитата Сообщение от xoraxax Посмотреть сообщение
зачем считать корни квадратного уравнения в несколько потоков?
Возможно, бинарный поиск. Хотя на потоки можно б было и более релистичную задачу придумать...
0
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
26.11.2018, 20:40 6
думаю просто один объект с уровнением и три потока каждый выполняет свою работу
первый вычисляет дискриминант
остальные два ждут чуда, дискриминант высилен, чудо произошло , остальные два потока продолжают работу, и скажем у нас результат дискриминанта волатайл переменная, и если она больше 0 то выполняются два потока
Java
1
2
x1 = (b + Math.sqrt(disc)) / (2 * a);
                    System.out.println("Корень 1 = " + x1);
Java
1
2
x2 = (b - Math.sqrt(disc)) / (2 * a);
                    System.out.println("Корень 12 = " + x2);
можно ещё четвёртый запилить если волатайл переменная равна нулю то предыдущие два потока гаснут и выполняется четвёртый
Java
1
2
x1 = (-1 * b  ) / (2 * a);
                    System.out.println("Корень 1 = " + x1);
если дискриминант меньше 0 то все три последние потока гаснут итерапт и всё.

Не по теме:

завтра могу решение написать если актуально, что -то позновато...

0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
26.11.2018, 21:02 7
Лучший ответ Сообщение было отмечено korvin_ как решение

Решение

Квадратное уравнение нет смысла решать больше чем в одном потоке. ТС скорее всего неверно понял задание.
1
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
27.11.2018, 07:16 8
Лучший ответ Сообщение было отмечено pauline5221 как решение

Решение

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//4 потока каждый выполняет свою работу
 
public class ThreadPoool {
 
    //вычисление дискримината
    public static class Discr implements Runnable {
        private Urovnenie ur;
        Discr(Urovnenie ur) {
            this.ur = ur;
        }
 
        @Override
        public void run() {
            Thread.currentThread().setName(" Поток вычисляющий Дискриминант ");
            System.out.println(Thread.currentThread().getName() + Thread.currentThread().isAlive());
            ur.setDesc();
        }
    }
    //вычисление первого корня
    public static class Xone implements Runnable {
        private Urovnenie ur;
        Xone(Urovnenie ur) {
            this.ur = ur;
        }
 
        @Override
        public void run() {
            Thread.currentThread().setName(" вычсляющий первый корень ");
            System.out.println(Thread.currentThread().getName() + Thread.currentThread().isAlive());
            ur.xOne();
 
        }
    }
 
    //вычисление второго корня
    public static class Xtwo implements Runnable {
        private Urovnenie ur;
        Xtwo(Urovnenie ur) {
            this.ur = ur;
        }
 
        @Override
        public void run() {
            Thread.currentThread().setName(" вычсляющий второй корень ");
            System.out.println(Thread.currentThread().getName() + Thread.currentThread().isAlive());
            ur.xTwo();
 
        }
    }
    public static class Xnull implements Runnable {
        private Urovnenie ur;
        Xnull(Urovnenie ur) {
            this.ur = ur;
        }
 
        @Override
        public void run() {
            Thread.currentThread().setName(" вычсляющий корень при D = 0 ");
            System.out.println(Thread.currentThread().getName() + Thread.currentThread().isAlive());
            ur.xNull();
        }
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import java.util.concurrent.CountDownLatch;
 
/**
 * класс уровнение содержит начальные данные и методы для решения уровнения
 */
public class Urovnenie {
    private final double a;
    private final double b;
    private final double c;
    private volatile Double disc = null;
    private double x1;
    private double x2;
    CountDownLatch count = new CountDownLatch(1);
 
    Urovnenie(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
 
    public Double getDisc() {
        return disc;
    }
 
    public double getX1() {
        return x1;
    }
 
    public double getX2() {
        return x2;
    }
 
    public void setDesc() {
        disc = Math.pow(b, 2) - (4 * a * c);
        System.out.println("Дискриминант = " + disc);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        count.countDown();
    }
 
    //метод вычисления первого корня
    public void xOne() {
        try {
            count.await();
            if (this.disc <= 0) {
                throw new InterruptedException();
            }
            x1 = ((-1 * b) - Math.sqrt(disc)) / (2 * a);
            System.out.println("Корень x1 = " + x1);
        } catch (InterruptedException e) {
            System.out.println("Запрос на прерывание поток " + Thread.currentThread().getName() + " вычисляющий X1 прервал работу в связи с тем, что D = " + this.disc);
        }
    }
 
    //метод вычисления второго корня
    public void xTwo() {
        try {
            count.await();
            if (this.disc <= 0) {
                throw new InterruptedException();
            }
            x2 = ((-1 * b) + Math.sqrt(disc)) / (2 * a);
            System.out.println("Корень x2 = " + x2);
        } catch (InterruptedException e) {
            System.out.println("Запрос на прерывание поток " + Thread.currentThread().getName() + " вычисляющий X2 прервал работу в связи с тем, что D = " + this.disc);
        }
    }
 
    //метод вычисления корня при D=0
    public void xNull() {
        try {
            count.await();
            if (this.disc != 0) {
                throw new InterruptedException();
            }
            x1 = (-1 * b) / (2 * a);
            System.out.println("Корень  = " + x1);
        } catch (InterruptedException e) {
            System.out.println("Запрос на прерывание поток " + Thread.currentThread().getName() + "   прервал работу в связи с тем, что D = " + this.disc);
        }
    }
}
тестирование:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import org.hamcrest.core.Is;
import org.junit.Assert;
import org.junit.Test;
 
 
public class UrovnenieTest {
    //старт потоков
    public void startThread(Urovnenie urovnenie) throws InterruptedException {
        Thread discThread = new Thread(new ThreadPoool.Discr(urovnenie));
        Thread xOne = new Thread(new ThreadPoool.Xone(urovnenie));
        Thread xTwo = new Thread(new ThreadPoool.Xtwo(urovnenie));
        Thread xNull = new Thread(new ThreadPoool.Xnull(urovnenie));
        discThread.start();
        xOne.start();
        xTwo.start();
        xNull.start();
        discThread.join();
        xOne.join();
        xTwo.join();
        xNull.join();
 
    }
 
    /**
     * уровнение не имеет корней
     *
     * @throws InterruptedException
     */
    @Test
    public void urovnenieTestwhendisMinnull() throws InterruptedException {
        Urovnenie urovnenie = new Urovnenie(4, 6, 10);
        this.startThread(urovnenie);
        Assert.assertThat(urovnenie.getDisc(), Is.is(-124.0));
        Assert.assertThat(urovnenie.getX1(), Is.is(0.0));
        Assert.assertThat(urovnenie.getX2(), Is.is(0.0));
        if (urovnenie.getDisc() < 0) {
            System.out.println("уровнение не имеет корней");
        }
    }
 
    /**
     * уровнение имеет один корень
     *
     * @throws InterruptedException
     */
    @Test
    public void urovnenieTestwhendisISgnull() throws InterruptedException {
        Urovnenie urovnenie = new Urovnenie(1, 6, 9);
        this.startThread(urovnenie);
        Assert.assertThat(urovnenie.getDisc(), Is.is(0.0));
        Assert.assertThat(urovnenie.getX1(), Is.is(-3.0));
    }
 
    /**
     * уровнение имеет два корня
     *
     * @throws InterruptedException
     */
    @Test
    public void urovnenieTestwhendisBignull() throws InterruptedException {
        Urovnenie urovnenie = new Urovnenie(1, 3, -4);
        this.startThread(urovnenie);
        Assert.assertThat(urovnenie.getDisc(), Is.is(25.0));
        Assert.assertThat(urovnenie.getX1(), Is.is(-4.0));
        Assert.assertThat(urovnenie.getX2(), Is.is(1.0));
 
    }
}
результат тестирования:

Кликните здесь для просмотра всего текста

вычсляющий первый корень true
Поток вычисляющий Дискриминант true
вычсляющий второй корень true
вычсляющий корень при D = 0 true
Дискриминант = 25.0
Корень x2 = 1.0
Запрос на прерывание поток вычсляющий корень при D = 0 прервал работу в связи с тем, что D = 25.0
Корень x1 = -4.0
Поток вычисляющий Дискриминант true
вычсляющий первый корень true
Дискриминант = -124.0
вычсляющий второй корень true
вычсляющий корень при D = 0 true
Запрос на прерывание поток вычсляющий первый корень вычисляющий X1 прервал работу в связи с тем, что D = -124.0
Запрос на прерывание поток вычсляющий корень при D = 0 прервал работу в связи с тем, что D = -124.0
Запрос на прерывание поток вычсляющий второй корень вычисляющий X2 прервал работу в связи с тем, что D = -124.0
уровнение не имеет корней
Поток вычисляющий Дискриминант true
Дискриминант = 0.0
вычсляющий второй корень true
вычсляющий первый корень true
вычсляющий корень при D = 0 true
Запрос на прерывание поток вычсляющий второй корень вычисляющий X2 прервал работу в связи с тем, что D = 0.0
Запрос на прерывание поток вычсляющий первый корень вычисляющий X1 прервал работу в связи с тем, что D = 0.0
Корень = -3.0

На данном примере мы смогли увидеть что потоки выполняются ассинхронно и мы не можем знать заранее какой стартанёт первый, но мы можем управлять потоками и необходимые операции выполнять параллельно а в некоторых случаях заставить поток подождать, или остановить поток, думаю тут много ещё с чем можно поэксперементировать , я использовал только волатайл переменную и коунтдовнланч ты можешь ещё придумать вариант решения и разобрать на этих вариантах примеры применения инструментов многопоточности и отразить это в курсовой
2
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 4
27.11.2018, 22:49  [ТС] 9
Спасибо большое, буду разбираться!!
0
27.11.2018, 22:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2018, 22:49
Помогаю со студенческими работами здесь

Решение квадратного уравнения
Помогите пожалуйста! Не могу найти в чем проблема, все работает, но в ответе вместо нужных корней...

Решение квадратного уравнения
Пользователь вводит коэффициенты квадратного уравнения. Вывести на экран корни уравнения. Если...

Решение квадратного уравнения: выбросить исключение, если дискриминант меньше 0
Даны коэффициенты a,b,c уравнения ax2+bx+c=0. Найти решение. Задачу вроде бы решил. Хочу добавить...

Решения квадратного уравнения(перевести на Java)
Очень нужно на завтра . Помогите с переводом с C++ на Java. Заранее благодарен: #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru