У меня есть поллер из Runnable.Поллер передает себя в ScheduledExecutorService.Так как мне нужно различное время задержки в зависимости от задач, я использую «schedule» вместо «scheduleWithFixedDelay», что вызвало проблему ...
К сожалению, этот опросщик не может правильно отключиться ...
Журнал показывает, что: в начале «главный» поток планирует опросник;после этого поток 'poller18' (или любой другой идентификатор потока) планирует следующие опрашивающие устройства:
При уничтожении основной поток вызывает уничтожение, устанавливает для флага значение true и затем вызывает poller.shutdown;но поток 'poller18' никогда не видит этот флаг (он всегда равен false в schedulePoller), поэтому он будет продолжать планировать следующие опросы.
Мои вопросы: 1. isShuttingDown - это закрытое поле в классе.Я думал, что это будет разделено потоками, так как это не ThreadLocal.Почему не так?2. в этой ситуации есть ли другой способ, которым poller18 может быть уведомлен о завершении работы poller?
class Poller implements Runnable {
private boolean isShuttingDown = false;
private ScheduledExecutorService poller = null;
@PostConstruct
protected synchronized void start() {
if (enabled && poller == null) {
poller = Executors.newScheduledThreadPool(1);
schedulePoller(1);
}
}
protected synchronized void schedulePoller(final long period) {
if (poller() == null || poller().isShutdown() || this.isShuttingDown) {
return;
}
LOGGER.info("schedule a new poller");
poller().schedule(this,
period,
TimeUnit.MILLISECONDS);
}
public void run() {
... do work ...
if (more work)
schedulePoller(1);
else
schedulePoller(10);
}
public void destroy() {
this.isShuttingDown = true;
poller.shutdown();
while (!poller.awaitTermination(SHUTDOWN_WAIT_SECONDS, TimeUnit.SECONDS)) {
LOGGER.info("Waiting for remaining tasks to finish.");
poller.shutdown();
}
LOGGER.info("All remaining tasks have finished.");
}
}
А в весеннем конфиге я устанавливаю destroy_method для destroy ().
МногиеСпасибо!Пожалуйста, дайте мне знать, если какие-либо путаницы в моем описании.