Как дать каждому потоку свою копию некоторых данных - PullRequest
0 голосов
/ 08 ноября 2019

В данный момент мой код использует тот же ArrayList, чтобы принять решение о том, куда перемещать каждый объект. Но я хочу дать каждому потоку свой ArrayList и заполнить каждый поток на основе object.

Я пытался synchronize метод, который заполняет ArrayListно это не решает мою проблему.

for(Object o : s.objects) {
    new Thread(() -> {
        ArrayList<Location> locations = new ArrayList<Location>();
        locations = s.getLocation(o.curLoc(), o.moves);
        location nextLoc;
        nextLoc = o.chooseBestLoc(locations);
        o.setLocation(nextLoc);
    }.start();
}

В настоящий момент я думаю, что это должно создать новый ArrayList для каждого потока, но поведение того, где движутся мои объекты, является неправильным. Они перемещаются в, казалось бы, случайные места.

Как мне дать каждому потоку свой ArrayList? или сделать так, чтобы у них не было одинаковых ArrayList?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Что вы можете сделать:

  1. Создайте свой собственный класс, который расширяет Thread, с arrayList в качестве поля класса
  2. Добавьте параметр объекта в конструктор
  3. В новом конструкторе заполняется arrayList базируется на переданном объекте

    class MyThread extends Thread {
    
      private List<Location> locations;
    
      public MyThread(Object o) {
         locations = .... // do somth to convert object to arraylist
      }
    }
    
0 голосов
/ 08 ноября 2019

Ehrebeco, я думаю, используя две глубокие копии списка. Один для зацикливания и один внутри потока. Надеюсь, это поможет.

С уважением, Srikanth Kondaveti

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