[英]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.