Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用AtomicBoolean阻止和等待_Java_Concurrency_Atomic_Java.util.concurrent - Fatal编程技术网

Java 如何使用AtomicBoolean阻止和等待

Java 如何使用AtomicBoolean阻止和等待,java,concurrency,atomic,java.util.concurrent,Java,Concurrency,Atomic,Java.util.concurrent,我正在寻找一种暂停线程的方法 我开始使用一个布尔标志(称为“暂停”),并用while循环(暂停)包装一个检查 在while循环中有一个线程。wait()来阻止执行 我一直在研究原子布尔值,它似乎能做到这一点,除了它不阻塞之外 是否有具有块方法的AtomicBoolean的替代或扩展版本 i、 类似于AtomicBoolean.get(false)的AtomicBoolean.getFalse() 它们有一个阻塞队列,所以有一个阻塞值 当前设置为: while (paused.get()) {

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

我开始使用一个布尔标志(称为“暂停”),并用while循环(暂停)包装一个检查

在while循环中有一个
线程。wait()
来阻止执行

我一直在研究原子布尔值,它似乎能做到这一点,除了它不阻塞之外

是否有具有块方法的AtomicBoolean的替代或扩展版本

i、 类似于
AtomicBoolean.get(false)
AtomicBoolean.getFalse()

它们有一个阻塞队列,所以有一个阻塞值

当前设置为:

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

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

            paused.notify();
        }
    }

你可以用锁

在你的线程中

while(!Thread.interrupted()) {
  lock.lock();
  try {
      // do something.
  } finally {
      lock.unlock();
  }
}

// to pause
lock.lock();

// to unpause
lock.unlock(); // has to be the same thread which locked.

或者你也可以忙着睡觉,这取决于你需要多快的时间才能醒来

while(atomicBoolean.get()) Thread.sleep(100); // or yield();

您正在等待一个特定的时间,这可以通过
Thread.sleep()
来完成,或者您需要等待某个东西,这表明您需要对正在等待的对象调用
wait()


如果确实需要手动告诉线程继续工作,请构建一个
while(true)
循环,其中包含
thread.sleep()
调用,并检查布尔值,如果设置正确,该布尔值将导致
中断。不过,我真的想不出这样做的理由。

我不确定我是否理解你的问题;不管怎样,您看过java.util.concurrent.Semaphore类了吗? 许可证=1的信号量应该提供您想要的行为,您可以模拟

暂停=真

指导

semaphore.tryAcquire()

semaphore.acquire()

如果你想锁定来电者。 您可以使用

semaphore.release()

首先,除非您使用原子操作(类似于test和set),
AtomicBoolean
与常规Boolean一样无用(如果它们是可变的)。在这里,我使用的是
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
        }
    }       
}   

根据您的代码,这些步骤甚至可能是嵌套的,或者包括涉及多个步骤的不可见执行单元。

使用1:

CountDownLatch conditionLatch = new CountDownLatch(1);
在您希望等待某个条件变为真的地方:

conditionLatch.await();
在要将条件设置为true的位置:

conditionLatch.countDown();

我认为锁只能从同一个线程解锁,因为如果线程1调用了锁,我不相信线程2可以调用解锁。是的,这就是我添加注释的原因。;)嗯,如果不同的线程可以启动/停止这个线程,这似乎有点随机。是的,这是一个web应用程序向正在运行的线程发送请求,让它暂停。我只是在寻找一种单行方法,而不是使用wait()和notify()同步块。我已经使用了一个普通布尔值和一个synchronized(this){while(paused){try{wait();}catch(Exception e){}this.notify();}这样的同步方法了但是我们正在寻求一种包罗万象的方法。嗯……我的观点是,你很可能对你的问题想得不对。原因是,可以归结为暂停执行。我目前有wait()方法。所以你有一个线程,你想暂停或停止消费,一个标志被放在适当的位置,现在我有一个如果是真的,在监视器上等待。我希望阻止实际状态。我将对此进行检查并进行测试,但我认为发布只能由获得许可证的线程完成。因此,线程1无法释放线程2获得的许可。我想我可能必须坚持使用Thread.wait(),javadoc说:不要求释放许可证的线程必须通过调用acquire()获得该许可证。信号量的正确使用是通过应用程序中的编程约定来确定的。信号量的静态实例完成了这项工作。谢谢,这(带有等待通知方法的布尔值)与我已经做的差不多,但我希望在并发包中已经为我做了一些事情。
conditionLatch.await();
conditionLatch.countDown();