为什么线程无法更新ArrayList字段?

时间:2015-10-03 16:08:19

标签: java multithreading

我的结构如下:

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

}

在没有线程的情况下传递对象时,会进行更改。但是,即使在创建字段Volatile之后,更改也不会反映出来。

1)上面的代码有什么问题? 2)按照这种方法可以吗? 3)做这些工作的一般方法是什么?

我对多线程很新。

2 个答案:

答案 0 :(得分:1)

如果你有一个执行某项任务的Thread对象并且想要查看结果,请等待它终止。

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

执行另一个线程没有太大的好处,而起始线程没有比等待已启动线程结束更好的事情了。

答案 1 :(得分:0)

你需要等到读者线程结束。

你可以使用期货或Thread.join()