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

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

В java, что я знаю, мы не можем назвать Thread более чем один раз, т.е.

Thread t = new Thread(//Some Runnable); t.start() t.start() //Illegal and throw Exception at Runtime. 

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

В этом случае то, что я знаю о Threadpool, дает лучшую производительность и экономит время, потому что нет необходимости создавать новый stream. (Я читал в http://www.javatpoint.com/thread-pooling-in-java )

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

Я прочитал это, http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html, и он говорит, что « большинство реализаций исполнителей в java.util.concurrent используют пулы streamов, которые состоят из рабочих streamов Этот вид streamа существует отдельно от задач Runnable и Callable, которые он выполняет, и часто используется для выполнения нескольких задач ».

Итак, что такое Worker thread, это что-то другое, чем обычные Java-streamи?

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

Так можно сказать так:

Резьба состоит из трех частей,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Пул streamов с использованием boost asio
  • Что определяет количество streamов, создаваемых Java ForkJoinPool?
  • В чем смысл гибкости streamов в ASP.Net?
  • Доступ к областям профилированных объектов в streamах
  • c ++ рабочие очереди с блокировкой
  • Сколько streamов слишком много?
  • Как настроить тонкую пул streamов для фьючерсов?
  • Тема против ThreadPool
  • Пул streamов C ++
  • Использование ThreadPool.QueueUserWorkItem в ASP.NET в сценарии с высоким трафиком
  • Ограничивающие streamи пула streamов C #
  • Давайте будем гением компьютера.