Jhon Edicen Ответов: 3

Ребята, я не знаю, как решить эту проблему с потоками. Я прочитал много источников, но не могу найти ничего полезного


Создайте многопоточную программу, которая считывает целочисленное значение n от пользователя (вы можете принять любую константу) и находит сумму чисел от 1 до n, используя 4 новых потока, где каждый поток вычисляет только ¼ суммы. Основная нить выводит окончательную сумму.

Что я уже пробовал:

import java.util.Scanner;

class sum implements Runnable {
    double a, b;

    public sum(double a, double b) {
        this.a = a;
        this.b = b;
    }

    public void run() {
        add(a, b);

    }

    public void add(double a, double b) {
        double sum = 0;
        synchronized (this) {
            for (double i = a; i <= b; i++) {
                sum = sum + i;

            }
            System.out.println("Sum of " + a + " to " + b + " numbers = " + (double) sum);
        }

    }
}

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        Thread t1 = new Thread(new sum((double) 1, (double) n / 4));
        Thread t2 = new Thread(new sum((double) (n / 4) + 1, (double) n / 2));
        Thread t3 = new Thread(new sum((double) (n / 2) + 1, (double) n * 3 / 4));
        Thread t4 = new Thread(new sum((double) (n * 3 / 4) + 1, (double) n));
        Thread main = new Thread(new sum((double) 1, (double) n));

        t1.start();
        t2.start();
        t3.start();
        t4.start();
        main.start();

        try {
            t1.join();
            t2.join();
            t3.join();
            t4.join();
            main.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

ZurdoDev

Есть много, очень много статей о том, как делать потоки в C# или C. Я не уверен, что вы искали, но их очень легко найти.

Если это действительно так-С, это первый результат в Google для меня, https://www.geeksforgeeks.org/multithreading-c-2/

KarstenK

У вас есть некоторый недостаток приведения типа в вычислении ваших конструкторов сумм, потому что вы делите целое число и приводите результат.

Я настоятельно рекомендую, чтобы ваш n был двойным!!!

3 Ответов

Рейтинг:
2

John R. Shaw

Это один из многих вопросов, которые заставляют меня задаться вопросом, Что же на самом деле пытается сделать инструктор. Я не буду говорить вам, как это сделать, но идея состоит в том, чтобы каждая нить работала последовательно. То есть вторая нить должна ждать, пока первая нить не будет закончена - я знаю, что это не имеет смысла, но продолжайте с ней. В конечном счете это освобождает 1-й поток, чтобы позволить ему обрабатывать следующий ввод (запрос). Таким образом, вместо того, чтобы ждать, пока поток полностью обработает свои вычисления, вы можете начать следующий.

Подумайте об этом.


Richard MacCutchan

- это заставляет меня задуматься, чего же на самом деле добивается инструктор."
Многие из нас здесь регулярно задаются одним и тем же вопросом. И почему они используют двойные типы в качестве новичков, особенно в качестве счетчиков циклов?

Jhon Edicen

Инструктор хочет проверить понимание правильного использования потоков ( как он это сказал). В этой задаче он хочет, чтобы мы написали программу, которая получает входные данные от пользователя, например 5, и наша программа должна иметь 4 потока, которые вычисляют сумму, 1+2+3+4+5. Но главное, он хочет от нас, чтобы каждый поток выполнял только 1/4 процессов, в этом случае каждый поток должен выполнять только 1/4 операции sum, а основной поток должен печатать сумму.

Рейтинг:
0

CPallini

К сожалению, Программирование потоков зависит от операционной системы. Однако Потоки Posix[^] широко поддерживаются, и вы можете легко найти информацию о них (см., например: Программирование потоков POSIX[^]).


Рейтинг:
0

Richard MacCutchan

Вы отметили свой вопрос "C", но ваш код-Java: я исправлю его. Вы можете узнать все о потоках в Java по адресу Урок: параллелизм (учебные пособия Java™ > Основные классы)[^]

Вы также можете упростить код, используя целочисленные типы, а не двойные, тем более что вы вычисляете только простые суммы.


Richard MacCutchan

The first thing you need to do is to write the simple methods to calculate the various sums, and then collect them together. So start with a method that takes two numbers (use integers to make it clear) and returns the sum of all the numbers in that sequence. So if you pass it the two values 7 and 11 it will return 45, i.e. 7 + 8 + 9 + 10 + 11. Once you have a working method you can go onto the next stage of accepting a number from the user and doing the same thing. Finally you need to learn about how the threads can interact and process part of the sum. Stay with integers as they are so much easier to work with, and try just two threads. Once you have that working add the other threads and test the whole thing. You can ensure it works with integers by always passing a number that is divisible by 4.

Не пытайтесь написать полную программу с самого начала, стройте ее раздел за разделом, точно так же, как вы сделали бы с созданием чего-то физического, такого как дом или автомобиль.

Richard MacCutchan

Я не могу сказать вам, приемлемо ли подчиняться, потому что я не ваш инструктор. Первый вопрос: дает ли он правильный ответ и использует ли он нити для получения этого ответа? Если нет, то он нуждается в уточнении на основе того, какие ответы он дает.