Запуск двух экземпляров ScheduledThreadPoolExecutor - PullRequest
1 голос
/ 12 января 2012

У меня есть ряд асинхронных задач для параллельного запуска. Все задачи можно разделить на два типа, давайте назовем один - тип A (который занимает много времени), а все остальное - тип B (быстрее и быстрее выполняемые). с одним ScheduledThreadPoolExecutor с x poolize, в конечном итоге в какой-то момент все потоки заняты выполнением типа A, так как тип результата B блокируется и задерживается. я пытаюсь выполнить задачи типа A параллельно типу B, и я хочу, чтобы задачи обоих типов выполнялись параллельно в своей группе для повышения производительности.

Считаете ли вы целесообразным иметь два экземпляра ScheduledThreadPoolExecutor для типов A и B исключительно со своими собственными пулами потоков? Видите ли вы какие-либо проблемы с этим подходом?

1 Ответ

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

Нет, это кажется разумным.Я делаю что-то подобное, т.е. мне нужно выполнять задачи последовательно в зависимости от некоторого идентификатора, например, все задачи для компонента с id = "1" должны выполняться последовательно друг другу и параллельно всем другим задачам, которые предназначены длякомпоненты с разными идентификаторами.поэтому в основном мне нужна отдельная очередь задач для каждого отдельного компонента, задачи извлекаются одна за другой из каждой конкретной очереди.Для этого я использую

Executors.newSingleThreadExecutor(new JobThreadFactory(componentId));

для каждого компонента.Кроме того, мне нужен ExecutorService для задач другого типа, которые не привязаны к componentIds, для этого я создаю дополнительный экземпляр ExecutorService

Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE, new JobThreadFactory());

Это отлично работает, по крайней мере, для моего случая.Единственная проблема, о которой я могу подумать, если есть необходимость упорядоченного выполнения задач, т.е. задача 2 НУЖНА быть выполнена после задачи 1 и так далее ... Но я сомневаюсь в этом в данном случае ...

...