Когда мы должны использовать stream Java над Executor?

Исполнитель выглядит как чистая абстракция. Когда вы хотите использовать Thread напрямую, а не полагаться на более надежного исполнителя?

Чтобы дать некоторую историю, исполнители были добавлены только как часть стандарта Java в Java 1.5. Таким образом, в некоторых случаях Исполнители можно рассматривать как новую лучшую абстракцию для решения задач Runnable.

Немного о чрезмерном упрощении … – Исполнители – это streamи, сделанные правильно, поэтому используйте их в предпочтении.

Я использую Thread, когда мне нужна обработка сообщений на основе pull. Например, Queue принимает () – en в цикле в отдельном streamе. Например, вы переносите очередь в дорогостоящем контексте – скажем, соединение JDBC, соединение JMS, файлы для обработки с одного диска и т. Д.

Прежде чем я получу проклятие, есть ли у вас сценарий?

Изменить :

Как указано другими, интерфейс Executor ( ExecutorService ) имеет больше возможностей, так как вы можете использовать Executors для выбора поведения: запланированного, приоритетного, кэшированного и т. Д. В Java 5+ или juc backport для Java 1.4.

Рамка-исполнитель имеет защиту от разбитых runnables и автоматически воссоздает рабочие streamи. Один из недостатков, на мой взгляд, awaitTermination() в том, что вы должны явно awaitTermination() shutdown() и awaitTermination() перед тем, как выйти из приложения, что не так просто в приложениях с графическим интерфейсом. Если вы используете ограниченные очереди, вам нужно указать RejectedExecutionHandler или вывести новые runnables.

Вы можете взглянуть на Брайана Гетца и др.: Java Concurrency in Practice (2006)

Нет преимущества использовать необработанные streamи. Вы всегда можете предоставить Executors фабрике Thread, так что даже опция создания пользовательских streamов будет рассмотрена.

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

Просто просто используйте Runnable или Executor.

Ну, я подумал, что ThreadPoolExecutor обеспечивает лучшую производительность, управляя пулом streamов, сводя к минимуму накладные расходы на создание нового streamа, выделение памяти …

И если вы собираетесь запускать тысячи streamов, это дает вам некоторые функции очередей, которые вам придется программировать самостоятельно …

Threads & Executors – это разные инструменты, используемые в разных сценариях … Как я вижу, это похоже на вопрос, почему я должен использовать ArrayList, когда могу использовать HashMap? Они разные…

Пакет java.util.concurrent предоставляет интерфейс исполнителя и может использоваться для создания streamа.

Интерфейс Executor предоставляет единый метод, выполняемый, предназначенный для замены для общей идиомы создания streamов. Если r – объект Runnable, а e – объект Executor, который вы можете заменить

(новая тема (r)). start ();

с

e.execute (г);

См. Здесь

Всегда лучше отдать предпочтение Исполнителю в Thread даже для одного streamа, как показано ниже.

 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1); 

Вы можете использовать Thread over Executor в следующих сценариях

  1. Для вашего приложения требуется ограниченный stream (-ы), а бизнес-логика проста

  2. Если простая многопоточная модель удовлетворяет вашим требованиям без пула streamов

  3. Вы уверены в том, что управляете сценариями жизненного цикла (-ов) streamов (-ов) с использованием API-интерфейсов низкого уровня в следующих областях: Inter thread communication, Exception handling, reincarnation of threads из-за неожиданных ошибок

и последний пункт

  1. Если ваше приложение не нуждается в настройке различных функций ThreadPoolExecutor

     ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 

Во всех остальных случаях вы можете обратиться к ThreadPoolExecutor

  • Dispatcher Invoke (...) против BeginInvoke (...) путаницы
  • 64-разрядные назначения в Java-атоме на 32-битной машине?
  • Что не так с использованием Thread.Abort ()
  • Как правильно закрыть java ExecutorService
  • Как передать параметр в Java-stream?
  • Разница между wait () и sleep ()
  • Накладные расходы на создание streamов Java
  • Почему этот код Parallel.ForEach заморозит программу?
  • Разница между указателем и ссылкой как параметр streamа
  • Использование C / Pthreads: должны ли переменные переменные быть неустойчивыми?
  • Как установить совместимость процессоров в .NET?
  • Interesting Posts
    Давайте будем гением компьютера.