以生产者/消费者模式暂停消费者

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)

ddm*_*mps 2

我认为您的解决方案简单而优雅,并且认为您应该对其进行一些修改。我建议的修改是同步

如果没有它,线程干扰和内存一致性错误可能(而且经常)发生。最重要的是,你不能waitnotify在你不拥有的锁上(如果你把它放在一个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)

  • 可能会更好地替换 if (mLocked) on while(mLocked)。http://stackoverflow.com/a/2779565/1173794 (2认同)