Действительно ли размер пула означает количество рабочих потоков?Да.
Если процесс Runnable потребителя занимает много времени, одновременно будет выполняться только 20.Остальные будут ждать в коллекции, пока не станет доступен поток для его запуска.
А если есть лучший способ сделать это.Есть ли причина, по которой вам нужно использовать темы?Если у вас нет 20 доступных процессоров, работающих параллельно, это может не увеличить ваше время обработки, поскольку все потоки будут тратить время на переключение контекста и т. Д., Которые бесполезны для обработки данных.
Кроме того, производителиполучать все данные и хранить их в потребителях.Если потребители не могут работать, потому что у вас их 500, и только 20 могут работать одновременно, тогда вы сохраняете (500 минус 20) * данные, которые вы можете обрабатывать.У вас могут быть потребители, выбирающие свои собственные данные.
В ответ на комментарий:
вместо
for (int index = 0; index < producerPoolSize; index++) {
Runnable producer = new Producer(consExec, chunkOfIdsForThisProducer);
prodExec.execute(producer);
}
и Процессор
for (Long id: list) {
data = get data from db for the id
consExec.execute(new Consumer(data));
}
Consumer выглядит следующим образом:
public class Consumer implements Runnable {
long myId;
Consumer(long id){
myId = id;
}
public void run() {
data = get data from db for the id
// do whatever a consumer does with data
}
}
и
private void start(String[] args) {
// Get list of ids create a new consumer for each id
for (int index = 0; index < everyID.length; index++) {
consExec.execute(new Consumer(everyID[i]));
}
}
Тогда вы теряете целый класс, и пул 20 имеет больше смысла, поскольку потребители, которые заблокированы при получении данных ввода-выводабудут ждать, и те, кто готов, могут продолжить обработку.