Когда вы определяете внешний флаг, который поток должен опрашивать и завершать, когда он установлен - , он должен быть volatile
.В противном случае поток может никогда не увидеть изменения, сделанные другим потоком.
Однако в стандартном API уже есть такая функция - она называется методом interrupt()
и Thread.currentThread().isInterrupted()
.Не нужно дублировать уже существующую логику.См .: Остановка определенного потока Java .
Сказанное, что вызов interrupt()
для каждого потока также является плохой идеей, потому что нет гарантии, что все потоки ответят на него.Изучая ваши исключения, я заметил, что следующие потоки не очищаются должным образом:
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0
- закрыть источник данных C3P0.Поскольку вы используете Spring, просто добавьте destroy-method="close"
.Мы закончили с этим потоком.
File Reaper
- насколько я вижу, этот поток создан FileCleaningTracker .Вам необходимо явно вызвать FileCleaningTracker.exitWhenFinished()
при закрытии приложения (или когда класс больше не нужен, я никогда не использовал его) или позволить Spring сделать это (см. Выше).Скорее всего, какая-то сторонняя библиотека использует ее и не закрывается должным образом - это означает, что в ней есть ошибка.
pool-1-thread-22
- это один из потоков, созданных Executors
утилита внутри ExecutorService
.Убедитесь, что вы вызываете shutdown()
для каждого такого пула в приложении во время выключения.
org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2
- Кварцевый рабочий поток (тот, который фактически выполняет задания).SchedulerFactoryBean
автоматически закрывает для вас планировщик, я думаю, что Tomcat здесь ошибается, я также часто вижу эту ошибку.Тем не менее, похоже, что установка SchedulerFactoryBean.waitForJobsToCompleteOnShutdown
в true
решает эту проблему.
com.iteezy.shared.domain.DirEntry.data
- Я не уверен в этом.Это либо ваш собственный поток, который необходимо прервать при завершении работы, либо поток базы данных H2 (?) Его стек необходимо проверить, чтобы определить, откуда он.
Суть в том, что: не просто уничтожайте все, что движется (на самом деле Tomcat делает это за вас после выдачи этого предупреждения), но и определяйте, откуда берутся потоки, и используйте специфичный для фреймворка / библиотеки метод close()
, чтобы обеспечить дальнейшую очистку.Будь нежным.