【发布时间】:2015-03-27 01:19:35
【问题描述】:
我做了一些研究,但找不到解决这个问题的方法。
从这个主题Synchronization, When to or not to use? 我知道我可以使用synchronized,但这样做并不能解决问题。
情况是我有一个方法,其中Thread 用于创建ArrayList。在同一个Thread 中,另一个method 在BufferedReader 完成读取文件并且行被添加到第一个列表后被调用。
在第二种方法中,第一个列表用于创建第二个列表。完成所有操作后,第一个方法使用第二个列表。
这是我使用的代码,如果有不清楚的地方请询问,我会尽力提供所需的信息。
public synchronized void theBaseList() {
Thread t = new Thread() {
@override
public void run() {
try(
while((line = br.readLine()) != null) {
firstList.add(line):
}
}
nextMethod();
currentObject = (Object[]) secondList.get(0); // throws an exception
}
}
};
t.start();
public synchronized void nextMethod() {
Thread t1 = new Thread(){
double objectListSize = calculateObjectListLength(firstList.size());
@override
public void run() {
try {
// create Objects
secondList.add(objects);
}
}
};
t1.start();
}
当我在nextMethod() 中使用Thread 从第一个列表中的项目中创建一个新的对象list 时,我得到一个ArrayIndexOutOfBoundsException 说
线程“Thread-4”java.lang.IndexOutOfBoundsException 中的异常:索引:0,大小:0
我通过在第二种方法中不使用Thread 来避免这种情况,并且一切正常。
如果我确实使用了 2 个Threads 并同时使用了两个方法synchronized,它仍然会抛出异常。
是否有可能或者我应该通过在第二种方法中不使用Thread 来解决?我以为synchronized 是用来处理这类问题的。我不明白为什么它不起作用。
【问题讨论】:
-
你的意思是“在单独的线程中运行方法时”?
-
@EJP 是的,第一个方法中的线程正在调用一个方法。
-
这里似乎没有理由使用单独的线程。操作是串行的。
t1依赖t完成第一个列表的填充,t依赖t1添加到第二个列表。 -
@Radiodef 我这样做是因为那里还有一个进度条,如果不使用线程我无法让它更新进度。
-
@Radiodef 很好,因为它是串行的,我不明白为什么会出现问题。
标签: java multithreading synchronized