[英]java threading, what's wrong with my code
我想在另一個線程中更新一個對象,然后在當前線程中訪問它:
public Object getValueAt(final int rowIndex, int columnIndex) {
data.getRealm().exec(new Runnable(){
@Override
public void run() {
System.out.println("Object at " + rowIndex + " in WritableList is " + data.get(rowIndex));
object = (DOModel) data.get(rowIndex);
System.out.println(object);
object.notify();
}
});
// suspend current thread
try {
synchronized (object){
object.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if(columnIndex == 0){
System.out.println(object);
return object.getId();
}
}
但是當我運行代碼時,會發生java.lang.IllegalMonitorStateException。
我更改了代碼,請參見代碼中的注釋: 編輯--------------------------------
public Object getValueAt(final int rowIndex, int columnIndex) {
data.getRealm().exec(new Runnable(){
@Override
public void run() {
System.out.println("Object at " + rowIndex + " in WritableList is " + data.get(rowIndex));
object = (DOModel) data.get(rowIndex);
synchronized(object){
object.notify();
}
}
});
try {
synchronized (object){
object.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
// this line below is never executed.
System.out.println(object);
if(columnIndex == 0){
return object.getId();
}
}
為了能夠進行通知,您需要在監視器上進行同步。 您需要執行以下操作:
synchronized (object) {
object.notify();
}
而不是run()中未同步的notify()。
您將以任何方式遇到競爭條件。 當尚未在單獨的線程中檢索到object
時,您的主線程可能正在嘗試在該object
上進行同步。
最好是定義一個單獨的鎖/監視器,並將其用於同步和通知。
第二次編輯:另外:如果單獨的線程檢索對象並在主線程等待之前進行通知,則它可能會無限期地等待。
notify()
調用應在同一監視器的同步塊內
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.