Hot*_*eam 6 java multithreading producer-consumer blockingqueue
我有生产者和消费者联系BlockingQueue.
消费者从队列中等待记录并处理它:
Record r = mQueue.take();
process(r);
Run Code Online (Sandbox Code Playgroud)
我需要从其他线程暂停这个过程一段时间.怎么实现呢?
现在我认为实现它,但它似乎是不好的解决方案:
private Object mLock = new Object();
private boolean mLocked = false;
public void lock() {
mLocked = true;
}
public void unlock() {
mLocked = false;
mLock.notify();
}
public void run() {
....
Record r = mQueue.take();
if (mLocked) {
mLock.wait();
}
process(r);
}
Run Code Online (Sandbox Code Playgroud)
我认为您的解决方案简单而优雅,并且认为您应该对其进行一些修改。我建议的修改是同步。
如果没有它,线程干扰和内存一致性错误可能(而且经常)发生。最重要的是,你不能wait或notify在你不拥有的锁上(如果你把它放在一个synchronized块内,你就拥有它......)。修复很简单,只需mLock在等待/通知的地方添加一个同步块即可。mLocked另外,当您从不同的线程进行更改时,您将需要将其标记为volatile。
private Object mLock = new Object();
private volatile boolean mLocked = false;
public void lock() {
mLocked = true;
}
public void unlock() {
synchronized(mlock) {
mLocked = false;
mLock.notify();
}
}
public void run() {
....
Record r = mQueue.take();
synchronized(mLock) {
while (mLocked) {
mLock.wait();
}
}
process(r);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
238 次 |
| 最近记录: |