我的结构如下:
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)做这些工作的一般方法是什么?
我对多线程很新。
答案 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()