Cai*_*der 3 java multithreading
我的代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
它现在似乎对我有用,但我不熟悉线程(它总是让我困惑),我应该像上面的代码那样做吗?
我应该像上面的代码那样做吗?
这看起来是一个旋转循环,将使用不必要的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();
}
}
...
Run Code Online (Sandbox Code Playgroud)
我觉得你根本不需要取物AtomicBoolean.你应该制作rowCountbe volatile然后你可以测试它的价值.while由于生产者/消费者竞争条件和虚假中断,循环是一个很好的模式.