Да, в некотором смысле, законченный Thread
должен будет ждать своих братьев и сестер в пуле: когда поток завершается, он останавливается и не помогает другим потокам завершиться раньше. Проще говоря, вся работа ждет нити, которая работает дольше всего.
Это потому, что каждый поток имеет ровно одну задачу. Вам лучше создавать много задач, намного больше, чем количество потоков, и помещать их все в одну очередь. Пусть все рабочие потоки выполняют свои задачи из этой очереди в цикле. Тогда разница во времени для всех потоков будет примерно равна времени выполнения одной задачи, которая мала, потому что задачи маленькие.
Вы можете запустить пул рабочих потоков самостоятельно, или вы можете обернуть каждую задачу в Runnable
и отправить их в стандартный пул потоков - это не имеет значения.