我的代码:
private AtomicBoolean fetched1 = new AtomicBoolean(false);
private int rowCount;
public int getRowCount() {
data.getRealm().exec(new Runnable(){
@Override
public void run() {
rowCount = data.size();
fetched1.set(true);
}
});
while(!fetched1.get()){
}
fetched1.set(false);
return rowCount;
}
它现在似乎对我有用,但我不熟悉线程(它总是让我困惑),我应该像上面的代码那样做吗?
答案 0 :(得分:7)
我应该像上面的代码那样做吗?
这看起来是一个使用不必要的CPU的旋转循环。最好使用wait
和notify
来表示数据已被提取。类似的东西:
private final Object lock = new Object();
private volatile Integer rowCount = null;
...
public void run() {
rowCount = data.size();
synchronized (lock) {
lock.notify();
}
}
synchronized (lock) {
// we loop here in case of race conditions or spurious interrupts
while (rowCount == null) {
lock.wait();
}
}
...
我认为你根本不需要获取AtomicBoolean
。您应该rowCount
为volatile
,然后您可以测试其值。由于生产者/消费者的竞争条件和虚假中断,while
循环是一个很好的模式。
答案 1 :(得分:4)
你有两个问题
相反,最简单的模式是锁定一个对象,并在值改变时等待/通知。