Самый простой способ разделения комбинаций - это иметь комбинации комбинаций. ;)
Для каждого возможного «первого» значения вы можете создать новую задачу в пуле потоков. Или вы можете создать каждую возможную пару «первый» и «второй» в качестве новой задачи. или три и т. д. Вам нужно всего лишь создать столько задач, сколько у вас есть процессоров, так что вам не нужно переходить за борт.
например. скажем, вы хотите создать все возможные выборы из 13 из 39 предметов.
for(Item item: items) {
List<Item> items2 = new ArrayList<Item>(items);
items2.remove(item);
// create a task which considers all selections of 12 from 38 (plus item)
createCombinationsOf(item, item2, 12);
}
Это создает примерно равную работу для 39 процессоров, что может быть более чем достаточно. Если вы хотите больше, создайте пары (39 * 38/2) из них.