gpt4 book ai didi

java线程,我的代码有什么问题

转载 作者:行者123 更新时间:2023-12-01 17:32:10 26 4
gpt4 key购买 nike

我想在另一个线程中更新一个对象,然后在当前线程中访问它:

 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()。

无论如何你都会遇到竞争条件。当尚未在单独的线程中检索对象时,您的主线程可能会尝试同步对象。

更好的方法是定义一个单独的锁/监视器并将其用于同步和通知。

第二次编辑:另外:如果单独的线程检索对象并在主线程等待之前发出通知,它可能会无限期地等待。

关于java线程,我的代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9910068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com