Подтвердить что ты не робот

Как Threadpool повторно использует потоки и как это работает

Мои концепции многопоточности слабы и пытаются учиться.

Я знаю, что в Java нельзя вызывать поток более одного раза:

Thread t = new Thread; //Some Runnable
t.start();

t.start(); //Illegal and throw Exception at runtime.

Насколько я знаю, он вызывает исключение, когда вы снова вызываете t.start(), потому что связанный стек для потока уничтожается, когда он выходит из метода run() и вы пытаетесь инициализировать вещи снова.

В этом случае, что я знаю о пуле потоков, это дает лучшую производительность & экономит время, потому что нет необходимости создавать новую тему (я читал в этом).

Если нет необходимости создавать новый поток в сценарии с пулом потоков, то как он будет работать с тем же потоком, который только что завершил свой метод run?

Я прочитал этот, и там говорится, что "Большинство реализаций исполнителя в java.util.concurrent используют пулы потоков, которые состоят из рабочих потоков. Этот тип потока существует отдельно от Runnable и Callable. задачи, которые он выполняет и часто используется для выполнения нескольких задач."

Итак, что такое рабочий поток, он отличается от обычных потоков Java?

С этой ссылкой я кое-что получил, но все еще не понял, какие вещи можно устранить, когда мы используем пул потоков, и почему он дает лучшую производительность, чем при использовании обычных потоков Java.

Итак, можем ли мы так сказать,

Тема состоит из трех частей,

  1. Создание (сообщая ОС, что это новый поток, создайте для него стек).
  2. Выполнить Runnable с помощью метода run().
  3. Уничтожение тем.

Таким образом, учитывая вышеупомянутые 3 шага, с пулами потоков шаг 1 и шаг 3 могут быть исключены после фиксированного количества созданных потоков. Будет выполнен только шаг 2 для каждой задачи, поэтому пул потоков быстрее? Можем ли мы так сказать? Я прав?

4b9b3361

Ответ 1

Если нет необходимости создавать новый Thread в сценарии ThreadPool, то как он работает с тем же потоком, который только что закончил свой метод запуска, будет ли этот поток снова использоваться?

Простой - исходная нить никогда не завершается. Он просто ждет выполнения другой задачи. В псевдокоде:

// No, this isn't even slightly accurate! General impression only :)
while (!pool.isShutdown()) {
    Runnable task = pool.waitForTaskOnQueue();
    task.run();
}

(Очевидно, что когда пул потоков отключен, ему также нужно будет прекратить ожидание потоков от ожидания другой задачи, но, надеюсь, вы получите общую идею.)

Ответ 2

Процесс работает в двух частях:

Представление задачи: пулы потоков тесно связаны с блокирующей очередью. Когда мы говорим execute.execute(runnable). Выполняемый/вызываемый в очереди помещается в очередь.

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

Итак, есть потоки, которые будут запускать бесконечный цикл и наблюдать за очередью задач. Как только задачи будут доступны, один поток выберет его и выполнит.

Ответ 3

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

Вы можете ограничить определенное количество параллельных потоков в пуле, что полезно для предотвращения перегрузки. Если все потоки заняты задачами, новые задачи помещаются в очередь, ожидая появления потока.

Ответ 4

Итак, учитывая выше 3 шага, с шагами 1 и 3 быть устранены после фиксированного количества создания темы. только Шаг 2 для каждая задача будет выполнена, поэтому Threadpool быстрее? можем мы скажите вот так? я прав?

Да, вы правы. Создание и уничтожение нитей - одна из дорогостоящих задач. Как и в потоке потока, потоки уже созданы, поэтому накладных расходов на создание потоков нет. Но если у вас гораздо более высокие потоки, чем должно было быть, это будет очень плохо для вашего приложения. Он может идти OutofMemorry или может быть в некоторых других проблемах. Поэтому, чтобы исправить размер пула потоков, используйте приведенную ниже формулу:

no of threads = 2 * no_of_cores * no_of_disks * percentage CPU utilization you need * (1 + (W/ C))

(W/C) - это доля, указывающая время ожидания для вычисления времени.