public class MainClass {
private static final int producerPoolSize = 10;
private static final int consumerPoolSize = 20;
private ExecutorService prodExec = Executors.newFixedThreadPool(producerPoolSize);
private ExecutorService consExec = Executors.newFixedThreadPool(consumerPoolSize);
//main method here, which calls start() below
private void start(String[] args) {
// Get list of ids, split them in to n(producerPoolSize) chunks
for (int index = 0; index < producerPoolSize; index++) {
Runnable producer = new Producer(consExec, chunkOfIdsForThisProducer);
prodExec.execute(producer);
}
}
public class Producer implements Runnable {
private ExecutorService consExec;
private List<Long> list;
public Producer(ExecutorService exec, List<Long> list) {
this.consExec = exec;
this.list = list;
}
public void run() {
for (Long id: list) {
data = get data from db for the id
consExec.execute(new Consumer(data));
}
}
}
public class Consumer implements Runnable {
public void run() {
// call web service
}
}
В приведенном выше коде у меня есть два пула потоков - по одному для производителей и потребителей. Я получаю несколько идентификаторов из базы данных, разделяю их на равные части, чтобы они были переданы потокам-производителю для обработки. Поток-производитель получает список идентификаторов и обрабатывает каждый последовательно, извлекая данные для каждого из идентификаторов и отправляя эти данные в поток-получатель для обработки. Теперь у меня такой вопрос:
Я создал 10 потоков производителей выше. И я хочу, чтобы размер пула потоков Consumer был равен 20. Но при обработке каждого идентификатора источник создает новый Runnable (Consumer) и отправляет (выполняет) его службе исполнителя Consumer. Насколько я понимаю, ExecutorService заключается в том, что Runnable, который вы ему отправляете, оборачивается в рабочий поток, а затем выполняется. Итак, в приведенном выше коде, если количество идентификаторов, которые получает каждый производитель, равно 50, действительно ли я создаю 50 * 10 = 500 потребительских потоков? Слишком много?
Или размер пула на самом деле означает количество рабочих потоков? Итак, в приведенном выше коде я создаю 500 задач для исполнителя Consumer, которые фактически будут поставлены в очередь и выполнены 20 рабочими потоками? Возможно, я не объясняю это правильно, но здесь немного запутался внутренней реализацией исполнителя и беспокоился, если я создаю слишком много потоков Consumer.
Если это не способ реализовать это, может ли кто-нибудь предложить лучший подход? Спасибо.