Предположим, ваш threads
равен 10. Возможно, вы думаете, что ваш код выдает 10 вызываемых в списке callables
, а затем запускает invokeAll
.Но на самом деле ваш код выполняет весь этот блок для каждого i
:
callables=new LinkedList<>();
callables.add(new PartOfImage(values,width,(height/threads)*i, (height/threads)*(i+1),
oldImage,((i+1)%threads)==0,(i%threads)==0));
List<Future<Object>> answers = executor.invokeAll(callables);
oldImage=getValues();
. Это означает, что он создает список с одним вызываемым объектом и запускает invokeAll
в этом списке, а затем переходит к следующему i
, создает список с одним вызываемым объектом, запускает invokeAll
в этом списке (с одной задачей) и т. Д.
Таким образом, по сути, он запускается последовательно.Вы должны переместить создание списка за пределы цикла i
, только цикл callables.add
должен быть внутри цикла, а invokeAll
и getValues
должны быть вне его.