Executor.shutdown () все еще ждет выполнения задач без invokeAll или waitTermination [duplicate]

Вы можете сделать это одним из двух способов:

Синтаксис соединения с обновлением MySQL:

  таблица обновленийA левая таблица joinB b на a.name_a = b.name_b  set validation_check = if (start_dts & gt; end_dts, 'VALID', '') - где может быть предложение where  

Синтаксис ANSI SQL:

  update  tableA set validation_check = (SELECT if (start_DTS & gt; end_DTS, 'VALID', '') как validation_check FROM tableA LEFT JOIN tableB ON name_A = name_B WHERE id_A = tableA.id_A)  

Pick какой вам кажется наиболее естественным для вас.

20
задан alapeno 18 November 2013 в 23:08
поделиться

5 ответов

Executors.newCachedThreadPool() использует Executors.defaultThreadFactory() для своего ThreadFactory. defaultThreadFactory javadocs говорят, что «каждый новый поток создается как поток без демона» (выделено мной). Итак, потоки, созданные для newCachedThreadPool, не являются демонами. Это означает, что они будут препятствовать естественному выходу JVM («естественно», я имею в виду, что вы все равно можете вызвать System.exit(1) или убить программу, чтобы заставить JVM остановиться).

Причина приложения совсем не заканчивается то, что каждый поток, созданный в newCachedThreadPool, истекает и закрывается после некоторого времени бездействия. Когда последний из них закрывается, если ваше приложение не имеет ничейных ничейных левых, оно прекратится.

Вы можете (и должны) закрыть ExecutorService вниз вручную с помощью shutdown или shutdownNow.

См. также JavaDoc для Thread , в котором говорится о демонах.

25
ответ дан yshavit 15 August 2018 в 17:29
поделиться
  • 1
    Получил это, спасибо за ваш подробный ответ на мой вопрос. – alapeno 18 November 2013 в 23:06
  • 2
    Хотя это будет работать, правильный ответ заключается в том, что вы должны завершить работу ExecutorService @alapeno. – Gray 18 November 2013 в 23:31
  • 3
    @Gray: Нет, посмотрите в Javadoc, который я цитировал в своем ответе, - эти потоки автоматически отключаются, если они простаивают в течение 60 секунд. – Russell Zahniser 18 November 2013 в 23:41
  • 4
    @Gray: если с помощью "основной резьбы" вы имеете в виду основной поток, он заканчивается в конце main(). Если вы имеете в виду поток AWT, он заканчивается, когда больше нет отображаемых компонентов. И нет фонового потока & quot; running & quot; ExecutorService за нитями в пуле; задание задачи в execute() (например) выполняется прямо в этом методе в потоке, который вызвал его. – Russell Zahniser 19 November 2013 в 15:58
  • 5
    Кэшированные потоки над ядрами-потоками в пуле потоков (см. ThreadPoolExecutor) автоматически завершаются @RussellZahniser, но основные потоки в пуле никогда не завершаются сами по себе, если они не являются потоками демона. Если какие-либо задачи были отправлены, вам нужно подождать, пока кэшированные потоки будут перегружены и будут получены. – Gray 19 November 2013 в 16:15

В основном на ExecutorService вы вызываете shutdown (), а затем ожидаетеTermination ():

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
   taskExecutor.execute(new MyTask());
}
taskExecutor.shutdown();
try {
  taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  ...
}
3
ответ дан Danke Xie 15 August 2018 в 17:29
поделиться

Из javadoc для Executors.newCachedThreadPool():

Нити, которые не использовались в течение шестидесяти секунд, завершаются и удаляются из кеша.

< / blockquote>

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

(Альтернативно, если вам все равно, все ли завершены задачи, например, если они обрабатывают фоновые вычисления, которые не имеют значения, как только ваш основной интерфейс исчезнет - тогда вы можете создать ThreadFactory, который устанавливает все потоки в этом пуле, чтобы быть демоном.)

4
ответ дан Gray 15 August 2018 в 17:29
поделиться
  • 1
    Спасибо за подсказку вызывать shutdown (), imho это подходит для моего сценария – alapeno 18 November 2013 в 23:08
  • 2
    Каково ваше определение & quot; must & quot ;? Javadocs для ExecutorService не говорят, что это «должен». быть закрытым (только это «может» быть), и ваше утверждение о том, что оно зависает (не «может» зависать) является либо повторением вопроса OP, либо просто некорректным, в зависимости от того, как вы определяете «зависание» . & Quot; Я согласен с тем, что хорошей практикой является закрытие ExecutorService, но если вы хотите уменьшить значение и сделать это утверждение три раза по этому вопросу, честно говоря, я думаю, вам нужно его поддержать. – yshavit 19 November 2013 в 06:49
  • 3
    Я изменил свой ответ @yshavit, чтобы добавить более подробную информацию. Хотя javadocs действительно говорят, что это «может», если вы не закрываете его, JVM не будет завершаться. Я пишу 100s из реализаций ExecutorService, и я редко устанавливал их как потоки, отличные от daemon. Выключение их в конце - правильный шаблон. – Gray 19 November 2013 в 15:46
  • 4
    Достаточно справедливо, и в любом случае достаточно хорошей практики, чтобы быть почти обязательным. – yshavit 19 November 2013 в 16:36
  • 5
    После вызова shutdown () вам также необходимо вызвать waitTerminate (...). Shutdown () не ожидает завершения ранее поставленных задач. См. Также stackoverflow.com/questions/1250643/… – Danke Xie 13 February 2015 в 11:15

Для многопоточной обработки ExecutorService Solution используется threadPool.shutdown ();

0
ответ дан Venkat Alugolu 15 August 2018 в 17:29
поделиться
5
ответ дан Gray 29 October 2018 в 00:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: