одновременный доступ к массиву без безопасности - PullRequest
0 голосов
/ 25 декабря 2018

значения полей - это float [], и я немного сбит с толку, потому что, когда я отлаживаю код, я запускаю проблему, что, когда один поток работает и использует мой массив значений с плавающей точкой [], другие ожидают, это нормально?Меня не волнуют неверные данные в массиве, потому что потоки вычисляют разные части массива

ExecutorService executor = Executors.newFixedThreadPool(threads);

List<PartOfImage> callables;
        for(int j=0;j<200;++j)
        for(int i=0;i<threads;++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();
        }

1 Ответ

0 голосов
/ 25 декабря 2018

Предположим, ваш 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 должны быть вне его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...