Управление пулом потоков демонов

Мне приходится обрабатывать группу демонов, каждый из которых реализует службу наблюдения. Что я хочу сделать, так это создать демонов, активировать их, деактивировать и удалить.

На данный момент при создании я делаю это, чтобы активировать:

        private void activateDaemon(Daemon daemon){
            Thread thread = new Thread(){
                    @Override
                    public void run(){
                            daemon.processEvents();
                    }
            };
            thread.start();
    }

Теперь это работает, но если я хочу деактивировать и удалить их. Деактивация останавливает события процесса (тот же метод, что и в http://docs.oracle.com/javase/tutorial/essential/io/notification.html ) и должен освободить поток. Удаление должно просто уничтожить демона.

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

Как мне лучше всего безопасно управлять, активировать и деактивировать группу демонов (сервисов наблюдения)?


person Sven    schedule 15.11.2013    source источник
comment
Вам действительно нужны демоны или вы можете перефразировать свою проблему, используя независимые задачи (сгенерированные из обработанных событий), которые выполняются в традиционном Executor?   -  person Ralf H    schedule 15.11.2013
comment
Демон - это просто соглашение об именах. Демон — это класс, у которого есть служба наблюдения, не больше и не меньше. Извините за путаницу.   -  person Sven    schedule 15.11.2013


Ответы (1)


Executor отлично подходит, если он соответствует вашей задаче, «короткоживущий» - это просто подсказка, но не обязательная. Проблема в том, что если у вас есть пул, скажем, 10 потоков, и все 10 заняты, ожидая определенного события, никакая другая задача не может быть обработана в то же время, потому что все 10 потоков заняты.

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

С другой стороны, вы можете использовать ThreadGroup/ThreadFactory и создавать потоки самостоятельно, что в основном представляет собой фиксированный ThreadPoolExecutor, но с большим контролем и дополнительной работой на вашей стороне.

person TwoThe    schedule 16.11.2013