Существует следующий метод:
public void method(Collection<BigInteger> objectIds) {
Collection<BigInteger> allObjectIds = new HashSet<BigInteger>(objectIds);
for(BigInteger objId : allObjectIds) {
SomeObject obj = getObjectById(objId); // obj.getColour(): red, green or blue
if(isFirstGroup(obj)) { // the first group
createInFirstGroup(obj);
} else { // the second group
createInSecondGroup(obj);
}
}
}
Ожидается получить много allObjectIds
в качестве входных данных. Для повышения производительности необходимо выполнить createInFirstGroup
, createInSecondGroup
одновременно, учитывая следующие условия:
- все объекты типа
SomeObject
можно разделить на две группы - первую и вторую. Все входящие объекты могут быть из 1-й группы, 2-й группы или из обоих.
SomeObject
класс имеет поле colour
, которое может быть равно «красный», «зеленый», «синий». Объекты с разными идентификаторами могут иметь одинаковые значения цвета. Таким образом, эти объекты с одинаковыми значениями цвета могут находиться внутри каждой группы (1-й, 2-й или оба). Их обработка в методах createInFirstGroup
, createInSecondGroup
не должна быть параллельной в случае равной группы и цвета.
Например, следующие комбинации неправильны (пара x, y):
- нить х, у: (1-я группа, зеленая; 1-я группа, зеленая)
- нить х, у: (2-я группа, зеленая; 2-я группа, зеленая)
Следующие комбинации являются правильными:
- нить х, у: (1-я группа, зеленая; 2-я группа, зеленая)
- нить х, у: (1-я группа, зеленая; 1-я группа, красная)
Как правильно (возможно, есть несколько подходящих шаблонов) портировать описанный метод public void method(Collection<BigInteger> objectIds)
(его часть for-loop) в параллельный, обеспечивая оптимальное количество потоков и распределение задач (с учетом описанных условий)?
Заранее спасибо!