Может ли несколько потоков выполнять одну задачу, чтобы эта задача выполнялась быстро? на Яве

У меня есть задача, на ее выполнение уходит много секунд. Поэтому я хочу знать, могу ли я, используя концепцию многопоточности в Java, использовать несколько потоков для выполнения этой единственной задачи, чтобы моя задача выполнялась быстро.

Вот мой пример. Класс потока:

public class ThreadImpl implements Runnable {
    @Override
    public void run() {
        String value = "a";

        for (int i = 0; i < 2147483646; i++) {
            value = value + "b";
        }
        System.out.println("thread task completed " + value);
    }
}

Основной класс

public class Main {

public static void main(String[] args) {

    Thread t = new Thread(new ThreadImpl());
        t.start();
    }
}

Я хочу понять, действительно ли возможно создать несколько потоков и одновременно выполнять эту задачу public void run()? Если да, то как этого добиться?

Что значит "в одиночку одновременно"?

tgdavies 23.12.2020 04:49

Где находится «а» параметра?

윤현구 23.12.2020 04:55

Это очень сложный вопрос. Выполняет ли задача ввод/вывод? Выполняет ли задача только вычисления, не требующие доступа к внешним ресурсам? Зависит ли каждый шаг задачи от предыдущих результатов? В вашем примере не выполняется ввод-вывод, за исключением одного раза в конце, поэтому вы можете запускать столько экземпляров, сколько у вас есть аппаратных ядер. 8 ядер дадут ускорение в 8 раз. Если задача выполняет много операций ввода-вывода или имеет последовательные зависимости, вы можете не получить большого ускорения. На этот вопрос нет однозначного ответа.

Jim Garrison 23.12.2020 04:56

Я имел в виду, что несколько потоков выполняются одновременно для выполнения этой задачи @tgdavies

RenceAbi 23.12.2020 05:03

@JimGarrison Нет ввода-вывода. Мне просто нужно выполнить эту задачу в одиночку с несколькими потоками вместе, чтобы сократить время выполнения.

RenceAbi 23.12.2020 05:04

Затем, если вы можете разделить обрабатываемые данные, вы сможете повысить производительность с помощью нескольких потоков. Учебное пособие о том, как это сделать, выходит за рамки StackOverflow.

Jim Garrison 23.12.2020 05:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
577
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Могу ли я использовать несколько потоков для выполнения одной задачи.

Это зависит от того, что вы подразумеваете под «задачей». В вашем примере показана одна функция, которая выполняет одно вычисление, когда она вызывается потоком. (Примечание: это не очень интересное вычисление, но, тем не менее, это вычисление.) Если одна и та же функция вызывается более чем одним потоком, то все, что произойдет, это то, что каждый поток будет выполнять идентичные вычисления, потому что это единственная вещь. что ваша функция была написана для выполнения. Никакое время не будет сохранено.

Чтобы несколько потоков могли сотрудничать при решении какой-либо проблемы, вы должны написать код, который предписывает им сотрудничать. Вы должны написать одну или несколько функций, которые могут выполнять части вычислений; Вы должны написать код, который назначает разные части разным потокам; и вам, вероятно, потребуется написать код, который объединяет частичные результаты в один окончательный результат. В Java нет магии, которая автоматически переписывает ваш однопоточный код, чтобы делать эти вещи за вас. Вы должны написать это сами.

Пример фрагмента с использованием параллельных потоков

final String[] value = {"a"};
    Stream.iterate(1,x -> x+1 )
            .limit(10)
            .parallel()
            .forEach(y -> value[0] = value[0] + "b"  );

Вы можете изменить предельное значение на необходимое вам количество. На моей машине с параллельной я вижу 5-кратный прирост производительности с параллельной, когда ограничение составляет 100000.

Если этот ответ решит вашу проблему, отметьте его как ответ или рассмотрите возможность голосования @RenceAbi

asolanki 23.12.2020 13:00

Другие вопросы по теме