4

Мне нужно выключить много разных реализованных потоков, которые имеют только один общий интерфейс Shutdown. Я не хочу передавать какую-либо глобальную коллекцию по всему коду и добавлять новые созданные потоки вручную, потому что она где-то будет забыта и, следовательно, является ошибкой hazzard.Зарегистрируйте все экземпляры интерфейса в каком-либо глобальном контейнере

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

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

Существует ли стандартный шаблон регистрации выключения или какая-либо передовая практика?

P.S. Все фрагменты кода можно редактировать.

+0

ли все реализации части вашего проекта или, возможно, они приходят из других банок во время выполнения? – Affe

+0

Детали из нескольких проектов, но я могу редактировать их все, поэтому это может быть и один проект. –

ответ

4

грубой силы подход будет list all running threads и просто использовать:

if(thread instanceof Shutdown) { 
    ((Shutdown)thread).shutdown(); 
} 

Конечно, есть более элегантные подходы:

  • Использование DI, чтобы придать глобальный контейнер нить

  • Рассмотрите возможность использования ThreadFactory с некоторой пользовательской логикой.

+0

Я думаю, что завод будет самым простым способом. Но мне интересно, не является ли плохая идея позволить Factory иметь только статические методы, но в то же время сохранять статическую коллекцию созданных потоков? Затем я мог бы легко опросить и добавить новую тему без необходимости передавать ссылки. Но я всегда чувствую себя немного неудобно, имея состояние в статическом классе. –

1

Если вы открыты для какого-то аспекта ориентированного программирования, то вы можете сделать это довольно легко с помощью Aspect J.

+0

Это другой компилятор, и я могу использовать некоторые аннотации, чтобы заставить это работать. Или какой будет общий подход? Его первый раз, когда я слышал об Aspect J. –