Ros*_*ays 2 java multithreading synchronization synchronized thread-safety
我一直在乱用Java中的同步,它还没有为我工作.
我有两个Runnable对象,用于创建单独的线程,每个对象都有一个共享ArrayList和一个共享Object的句柄(用于synchronized).第一个Runnable始终为数组列表中的所有对象读取tsome实例变量,第二个Runnable不断更新数组列表中所有对象的实例变量.
我现在设置它的方式,两个Runnable对象都包含一个指向我打算用作锁的Object的指针.
可运行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();
}
}
Run Code Online (Sandbox Code Playgroud)
可运行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();
}
}
Run Code Online (Sandbox Code Playgroud)
所以从技术上讲,第一个Runnable总是在屏幕上绘制对象,第二个是根据时间的变化计算项目的新位置.
我错过了什么?
看起来你的线程都要开始并陷入其中wait(),除非你有一些其他对象你没有向notify()其中一个显示(只是为了启动它们.)你必须确保两个线程都是等候.
或者你可以改变其中的一个先做好自己的工作,然后打电话notify(),然后wait().同样,你必须确保其他线程已经在等待.