簡體   English   中英

如何使用AtomicBoolean阻止和等待

[英]How to Block and wait using AtomicBoolean

我正在尋找一種暫停線程的方法。

我開始有效地使用布爾標志(稱為'暫停'),並使用while循環(暫停)包裝檢查。

在while循環中有一個Thread.wait()來阻止執行。

我一直在看AtomicBoolean ,除了它不會阻止之外,它似乎可以解決這個問題。

是否有替代或擴展版本的AtomicBoolean有一個塊方法?

AtomoicBoolean.get(false) AtomicBoolean.getFalse()AtomoicBoolean.get(false)東西?

它們具有阻塞隊列,因此具有阻塞值。

目前的設置是:

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

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

            paused.notify();
        }
    }

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

}


public void resume() {
    if (paused.compareAndSet(true, false)) {
        synchronized (paused) {
            paused.notify();
        }
    } 
}
    AtomicBoolean lock = new AtomicBoolean(false);
    if(lock.compareAndSet(false, true)){
        try {
            //do something
        } catch(Exception e){
            //error handling
        } finally {
            lock.set(false);
        }
    }

首先,除非你使用原子操作(類似於測試和設置), 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
        }
    }       
}   

根據您的代碼,這些步驟甚至可以嵌套,或者包括涉及多個步驟的不可分割的執行單元。

使用CountDownLatch為1:

CountDownLatch conditionLatch = new CountDownLatch(1);

在您想要等待某些條件變為真的地方:

conditionLatch.await();

在您要將條件設置為true的位置:

conditionLatch.countDown();

我不確定我是否明白你的問題;無論如何你看過java.util.concurrent.Semaphore類嗎? permit = 1的信號量應該給你想要的行為,你可以模仿你的

暫停= TRUE;

指導

semaphore.tryAcquire();

要么

semaphore.acquire();

如果你想鎖定來電者。 您可以使用釋放線程

semaphore.release();

你可以使用鎖。

在你的線程中。

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()你正在等待做好准備的對象。

如果你真的需要手動能夠告訴你的線程繼續工作,那么構建一個包含Thread.sleep()調用的while(true)循環,並檢查一個boolean,如果設置正確,會導致break 我無法想到這樣做的理由。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM