Вы можете сделать это одним из двух способов:
Синтаксис соединения с обновлением 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 какой вам кажется наиболее естественным для вас.
Executors.newCachedThreadPool()
использует Executors.defaultThreadFactory()
для своего ThreadFactory
. defaultThreadFactory
javadocs говорят, что «каждый новый поток создается как поток без демона» (выделено мной). Итак, потоки, созданные для newCachedThreadPool
, не являются демонами. Это означает, что они будут препятствовать естественному выходу JVM («естественно», я имею в виду, что вы все равно можете вызвать System.exit(1)
или убить программу, чтобы заставить JVM остановиться).
Причина приложения совсем не заканчивается то, что каждый поток, созданный в newCachedThreadPool
, истекает и закрывается после некоторого времени бездействия. Когда последний из них закрывается, если ваше приложение не имеет ничейных ничейных левых, оно прекратится.
Вы можете (и должны) закрыть ExecutorService
вниз вручную с помощью shutdown
или shutdownNow
.
См. также JavaDoc для Thread , в котором говорится о демонах.
В основном на 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) {
...
}
Из javadoc для Executors.newCachedThreadPool()
:
Нити, которые не использовались в течение шестидесяти секунд, завершаются и удаляются из кеша.
< / blockquote>Обычно рекомендуется называть
shutdown()
наExecutorService
, если вы знаете, что никакие новые задачи не будут отправлены на него. Затем все задачи в очереди будут завершены, но служба немедленно отключится.(Альтернативно, если вам все равно, все ли завершены задачи, например, если они обрабатывают фоновые вычисления, которые не имеют значения, как только ваш основной интерфейс исчезнет - тогда вы можете создать
ThreadFactory
, который устанавливает все потоки в этом пуле, чтобы быть демоном.)
ExecutorService
, но если вы хотите уменьшить значение и i> сделать это утверждение три раза по этому вопросу, честно говоря, я думаю, вам нужно его поддержать.
– yshavit
19 November 2013 в 06:49
ExecutorService
, и я редко устанавливал их как потоки, отличные от daemon. Выключение их в конце - правильный шаблон.
– Gray
19 November 2013 в 15:46
Для многопоточной обработки ExecutorService Solution используется threadPool.shutdown ();
ExecutorService
@alapeno. – Gray 18 November 2013 в 23:31main()
. Если вы имеете в виду поток AWT, он заканчивается, когда больше нет отображаемых компонентов. И нет фонового потока & quot; running & quot;ExecutorService
за нитями в пуле; задание задачи вexecute()
(например) выполняется прямо в этом методе в потоке, который вызвал его. – Russell Zahniser 19 November 2013 в 15:58ThreadPoolExecutor
) автоматически завершаются @RussellZahniser, но основные потоки в пуле никогда не завершаются сами по себе, если они не являются потоками демона. Если какие-либо задачи были отправлены, вам нужно подождать, пока кэшированные потоки будут перегружены и будут получены. – Gray 19 November 2013 в 16:15