Как управлять исполнителями - PullRequest
3 голосов
/ 11 ноября 2011

В моей практике нередко программное обеспечение, которое я разрабатываю, становится большим и сложным, и различные его части используют исполнителей по-своему.С точки зрения производительности было бы лучше использовать разные конфигурации пула потоков в каждой части.Но с точки зрения удобства обслуживания и удобства использования кода было бы более предпочтительно, если бы все объекты, связанные с потоками, параллелизмом и использованием ЦП, были сохранены и настроены в каком-то централизованном месте.

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

Создание какого-то вида ExecutorManager и передача одного пула потоков вокруг приложения также не годится, потому что, в зависимости от типа задачи и скорости отправки, неправильно настроенная комбинация рабочей очереди и размера пула потоков может очень сильно повредить производительности.

Итак, вопрос в том, существуют ли какие-то общие подходы к решению этой проблемы?

Ответы [ 2 ]

2 голосов
/ 04 декабря 2012

Я бы создал 2 или 3 ThreadPools, которые можно настроить по-разному в зависимости от выполняемых ими задач, если у вас есть более 3 разных одновременных действий, у вас есть большая проблема.

Пулы могут быть добавлены при необходимости(например, по имени), кроме того, я бы создал аннотацию для выполнения определенного метода с конкретным пулом / исполнителем с использованием AOP (например, aspectj).

Средство разрешения аннотаций должно иметь доступ ко всем пулам / исполнителям и отправлять задачу, используя задачу, указанную в аннотации.

Например:

@Concurrent ("pool1")
public void taskOfTypeOne() {
}

@Concurrent ("pool2")
public void taskOfTypeTwo() {
}
1 голос
/ 04 декабря 2012

То, что вы ищете, это Внедрение зависимостей или Инверсия управления. Одна из самых популярных платформ DI для Java - Spring . Вы создаете обычные объекты Java, но с конкретными аннотациями или путем настройки их в XML, чтобы соединить их вместе. Таким образом, вы можете настроить различные экземпляры ExecutorService в одном месте и запросить их внедрение (возможно, по имени) в клиентские классы, которые в них нуждаются.

...