Зарегистрируйте все экземпляры интерфейса в некотором глобальном контейнере - PullRequest
4 голосов
/ 07 января 2012

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 07 января 2012

Подход грубой силы должен был бы перечислить все запущенные потоки и просто использовать:

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

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

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

  • Попробуйте использовать ThreadFactory с некоторой пользовательской логикой.

1 голос
/ 07 января 2012

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

...