2014-04-11 66 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