如何使用AtomicBoolean阻止和等待

Ben*_*Ben 15 java concurrency atomic java.util.concurrent

我正在寻找一种暂停线程的方法.

我开始有效地使用布尔标志(称为'暂停'),并使用while循环(暂停)包装检查.

在while循环中,有一个Thread.wait()阻止执行.

我一直在看AtomicBoolean,除了它不会阻止之外,它似乎可以解决这个问题.

是否有替代或扩展版本的AtomicBoolean有一个块方法?

即喜欢AtomicBoolean.getFalse()的东西AtomoicBoolean.get(false)

它们具有阻塞队列,因此具有阻塞值.

目前的设置是:

while (paused.get()) {
        synchronized (paused) {
            try {

                paused.wait();
            } catch (Exception e) {
            }

            paused.notify();
        }
    }
Run Code Online (Sandbox Code Playgroud)

public void pause() {
    if (paused.compareAndSet(false, true)) {
        synchronized (paused) {
            paused.notify();
        }
    }

}


public void resume() {
    if (paused.compareAndSet(true, false)) {
        synchronized (paused) {
            paused.notify();
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

Mis*_*ith 12

    AtomicBoolean lock = new AtomicBoolean(false);
    if(lock.compareAndSet(false, true)){
        try {
            //do something
        } catch(Exception e){
            //error handling
        } finally {
            lock.set(false);
        }
    }
Run Code Online (Sandbox Code Playgroud)

首先,除非你使用原子操作(类似于测试和设置),否则与AtomicBoolean常规布尔值一样无用(如果它们是可变的).我在这里使用compareAndSet,所以只有在旗帜下降时它才进入临界区.记得永远解锁.

要使用标志暂停线程,请不要进行主动等待(线程主体中的某个循环询问"我暂停了吗?"),因为这不是一种有效的做法.我会使用等待通知方案.当线程没有更多工作要做时,它会调用wait某个对象.然后,要重新启动,其他一些线程会调用notify同一个对象.

如果你想立即暂停(就设置标志时的跳过执行而言),你可以在尽可能多的步骤中划分代码,并用测试包装每个代码,最后等待暂停:

public void run(){
    while(true){
        if(!paused){
            //do something
        }

        if(!paused){
            //do something
        }

        if(!paused){
            //do something
        }

        if(!paused){
            //do something
        }

        if(paused){
            //wait on some object
        }
    }       
}   
Run Code Online (Sandbox Code Playgroud)

根据您的代码,这些步骤甚至可以嵌套,或者包括涉及多个步骤的不可分割的执行单元.


qwe*_*guy 7

使用CountDownLatch1:

CountDownLatch conditionLatch = new CountDownLatch(1);
Run Code Online (Sandbox Code Playgroud)

在您要等待某种条件变为真的地方:

conditionLatch.await();
Run Code Online (Sandbox Code Playgroud)

在您要将条件设置为true的地方:

conditionLatch.countDown();
Run Code Online (Sandbox Code Playgroud)