2015-10-03 2 views
0

Моя структура выглядит следующим образом:Почему поток не может обновить поле ArrayList?

public class ReadCSV { 

    volatile List<FlightDetails> detail; 


main() { 

    ReadCSV obj=new ReadCSV(); 

    obj.detail=Collections.synchronizedList(new ArrayList<FlightDetails>()); 

    new Thread(new Runnable(){ 

     @Override 
     public void run() { 


      try { 
       ... 
       //pass the object along 
       readAndParseFile("someFile.csv",obj); 

      } catch (IOException e) { 
       ... 
      } 

       // prints Alright 
      System.out.println(obj.detail.get(0).getDep_loc()); 
     }  
    }).start(); 

    // Throws AIOB Exception 
    System.out.println(obj.detail.get(0).getArr_loc()); 
} 

static void readAndParseFile(String csvFileName, ReadCSV obj) { 

... 
.. 
//make changes to the object 
obj.detail.add() 

// works fine 

} 

При прохождении объекта без резьбы, изменения made.But изменения не отражаются даже после создания поля Volatile.

1) что не так в приведенном выше коде? 2) Можно ли следовать этому подходу? 3) Каков общий способ выполнения таких заданий?

Я очень новичок в многопоточности.

+0

Вы просите кого-то еще, чтобы собрать некоторые элементы из библиотеки в корзину в вашей двери. ['start'] Пока кто-то уходит [' run'], вы смотрите в корзину ['println']: ничего нет, и вы раздражены. Разумно? Нет. Вы должны ждать возвращения вашего помощника ... – laune

+0

Другими словами, возможно, новая нить на самом деле ничего не помещала в список. Подожди немного. – NickJ

ответ

1

Если у вас есть объект Thread, который выполняет некоторую задачу, и вы хотите увидеть результаты, дождитесь его завершения.

Thread p = new Thread(new Runnable(){ 
    //... 
}); // no start here 
p.start(); // let it run 
p.join(); // wait for its end 

Существует не так много выигрыша в выполнении другого потока при стартовом потоке не имеет ничего лучше, чем ждать завершения запущенного потока.

+0

Не думаю, что я пропустил это. Не могли бы вы предложить, как я последовал за прохождением объекта? Таким образом, я чувствовал себя немного неловко. –

+0

Я бы предложил создать подкласс Thread, передать List через конструктор. Не уверен, что этот главный метод находится в фрагментах вашего вопроса. – laune

+0

Спасибо. Это основной метод. –

0

вам нужно подождать, пока закончится ваш поток читателей.

вы можете использовать фьючерсы или Thread.join()

+0

Спасибо за ответ :) –

Смежные вопросы