我一直在乱用Java中的同步,它还没有为我工作。
我有两个用于创建单独线程的Runnable对象,每个对象都有一个共享ArrayList句柄和一个共享Object(用于synchronized)。第一个Runnable总是为数组列表中的所有对象读取tsome实例变量,第二个Runnable不断更新数组列表中所有对象的实例变量。
我现在设置它的方式,两个Runnable对象都包含一个指向我打算用作锁的Object的指针。
Runnable 1:
public void run() {
if (syncLock == null)
return;
synchronized (syncLock) {
try {
syncLock.wait();
} catch (InterruptedException e) {
}
for (int i = 0; i < list.size(); i++) {
drawItem(list.get(i));
}
syncLock.notify();
}
}
Runnable 2:
public void run() {
if (syncLock == null)
return;
synchronized (syncLock) {
try {
syncLock.wait();
} catch (InterruptedException e) {
}
for (int i = 0; i < list.size(); i++) {
updateItem(list.get(i));
}
syncLock.notify();
}
}
所以从技术上讲,第一个Runnable总是在屏幕上绘制对象,第二个是根据时间的变化计算项目的新位置。
我缺少什么?
答案 0 :(得分:5)
看起来你的线程都要开始并卡在wait()
中,除非你有一些其他对象你没有在notify()
其中一个显示(只是为了启动它们) 。)你必须确保两个线程都在等待。
或者,您可以先更改其中一个,然后再调用notify()
,然后wait()
。同样,你必须确保其他线程已经在等待。