2014-04-11 65 views
0

我有一個簡單的「播放/暫停」標誌。想象一下doer線程:Java中的布爾信號量

private final Thread backgroundDoer = new Thread(() -> { 
     while(true) { 
      doOperation(); 
      playFlag.await(); 
     } 
}) 

因此,除非標誌爲false,否則等待標誌爲真,繼續執行操作。

我的問題是如何在Java中正確執行此操作。我無法真正使用Condition,因爲我需要不斷從外部發出信號。現在我正在使用Semaphore。當按下「play」時,我給它許多許可證,當按下暫停時,我將它們全部排走。儘管這看起來很笨重和愚蠢。有更好的方法嗎?

+3

Wait ...'Semaphore'沒有'await()'方法。你有幾個後臺線程,這就是爲什麼你使用多個許可證? – Kayaman

+0

等待那裏真的是我想要的僞代碼。只有一個後臺線程。這就是爲什麼我真的不想使用信號量,而只是一個條件,我可以設置一次,它不會阻止,直到我告訴它 – CarrKnight

+1

這既不笨重也不愚蠢。這正是信號量應該做的。唯一值得注意的是,你需要計算信號量,而不是二進制,並且操作被調用\t acquire(),而不是await()。 –

回答

1

您可以簡單地獲得許可證(使用二進制文件Semaphore)並立即發佈。

如果事情還沒有暫停,它只會獲取並返回它(如果調用,允許暫停獲取它),繼續操作。但是,如果發生暫停,只要嘗試獲取就會阻塞。

while(true) { 
    doOperation(); 
    semaphore.acquire(); // Block if paused 
    semaphore.release(); // Release immediately, so pause() can acquire() the semaphore 
} 
+1

就像一個魅力。 – CarrKnight