Планирование нескольких задач в одном потоке

#java #scheduled-tasks #timertask

#java #запланированные задачи #timertask

Вопрос:

Я хочу, чтобы один поток нес ответственность за несколько задач, запланированных с разными интервалами. Я хочу добавлять и удалять задачи из планировщика. Существуют ли какие-либо библиотеки, которые могут мне помочь в этом. Если нет, я буду кодировать свой собственный, просто не хочу изобретать велосипед.

Для фона я хочу добавить оповещения в мое приложение, управляемое из одного потока, где остальная часть приложения может добавлять / удалять запланированные задачи. Я могу использовать несколько временных задач или написать свой собственный однопоточный планировщик, но если есть вариант получше, я не хочу его упускать.

Джеймс

Ответ №1:

Если вам нужно что-то, что доступно прямо из коробки в JDK 1.5 или более поздней версии, вы смотрели на ScheduledExecutorService?

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html

Вы можете создать один из них с поддержкой одного потока, используя этот заводской метод:

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html#newSingleThreadScheduledExecutor ()

Существует также альтернативный фабричный метод, который принимает ThreadFactory в качестве аргумента. Это дает вам возможность настроить поток, который будет выполняться внутри ScheduledExecutorService. Например, вы можете вызвать Thread.setName, чтобы присвоить потоку более осмысленное имя. Это очень полезно для отладки приложения. Когда вы создадите полный дамп потока, вы увидите свое пользовательское имя, прикрепленное к потоку, вместо общего имени, автоматически прикрепляемого JVM.

В зависимости от необходимости также может оказаться целесообразным вызвать Thread.setDaemon(true), чтобы этот поток не блокировал завершение работы JVM.

Кроме того, рекомендуется очистить любой ExecutorService после того, как вы закончите с ним, вызвав ExecutorService.shutdown или ExecutorService.shutdownNow. Без гарантированного вызова shutdown (например, в блоке finally) в вашем приложении может возникнуть ошибка утечки потоков. Из описанного вами использования кажется маловероятным, что это вас заинтересует, но мне всегда нравится подчеркивать это, когда я даю кому-то рекомендацию использовать ExecutorService. В JavaDocs легко пропустить этот момент.

Ответ №2:

Если вам нужна базовая библиотека, вы можете использовать встроенный ScheduledExecutorService. Это позволяет добавлять повторяющиеся задачи и отменять их. Вы можете настроить его как однопоточный.

Ответ №3:

Проверьте Quartz. Это в значительной степени способ планирования задач в Java. Вы можете настроить его как однопоточный, если просмотрите документы.