2013-10-14 5 views
2

Я унаследовал код, который использует Executors.newFixedThreadPool (4); для запуска 4 долгоживущих потоков, которые выполняют всю работу приложения.Java-исполнитель и долгоживущие потоки

Рекомендуется ли? Я прочитал книгу Java Concurrency in Practice, и, похоже, нет большого руководства по управлению долговременными приложениями.

Каков рекомендуемый способ запуска и управления несколькими потоками, каждый из которых предназначен для всего живого приложения?

ответ

2

Вы упомянули, что код использует Executors, он должен быть возвращая ExecutorService

ExecutorService executor = Executors.newFixedThreadPool(NTHREDS); 

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

До тех пор, пока возвращенный ExecutorService выполняет изящное закрытие, не должно быть проблем.

Вы можете проверить, что ваш код делает shutodwn, находя следующие в коде:

// This will make the executor accept no new threads 
// and finish all existing threads in the queue 
executor.shutdown(); 

// Wait until all threads are finish 
executor.awaitTermination(); 

Ура !!

+0

Мой вопрос не в том, является ли SAFE для управления долговременными прикладными потоками таким образом, а скорее является ли это лучшей практикой. – mattx

+1

Да, если вы позаботились о том, чтобы закрыть изящество и закрыть все ресурсы, которые используются этими потоками. –

1

Я предполагаю, что ваш долгоживущий поток выполняет некоторую периодическую работу в цикле. Что вы можете сделать, это следующее:

  1. Убедитесь, что каждый из запускаемых пулов проверяет состояние пула перед циклом. Таким образом,

    while(! pool.isShutdown()) { ... }

    Ваш исполняемым должны иметь ссылку на их родительский пул.

  2. Установить крюк остановки JVM с помощью Runtime.addShutdownHook(). Перехват вызывает pool.shutdown(), затем pool.awaitTermination(). Пул перейдет в состояние SHUTDOWN, и в конце концов потоки остановятся, после чего он перейдет в состояние TERMINATED.

-

Тем не менее, я немного подозрительными ваших 4 потоков. Разве не должно быть только один длинный поток, который извлекает задачи и отправляет их в службу исполнителя? У вас действительно есть 4 разных долгоживущих процесса? (Это рассмотрение ортогонально основному вопросу).

+0

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

Смежные вопросы