我实质上是在设想一种具有绿灯和红灯的“交通灯”。当指示灯为绿色时,我们可以doWork()
使用。当指示灯为红色时,我需要等待doMaintenance()
完成后才能执行doWork()
。我已经完成了以下操作,并且似乎工作正常,但是我想知道这是否是一个幼稚的解决方案:
private volatile boolean lightIsGreen = true;
public void doSomeWorkIfLightIsGreen() {
while(!lightIsGreen) {
try {
Thread.sleep(1); // I'm not sure what value to put here
} catch (InterruptedException e) {
// Log exception
}
}
doWork();
}
然后在同一类中有一个单独的函数经常运行:
private void doMaintenance() {
lightIsGreen = false;
doMaintenance();
lightIsGreen = true;
}
在我的实际代码中,doMaintenance()
得到了几次成功完成的机会。如果无法完成,则整个应用程序将正常关闭。
是否有更好/更优雅的方式来实现这种“交通灯”功能?
编辑:我应该提到doSomeWorkIfLightIsGreen()
可以从多个线程中调用,我不想使那些线程一次必须执行一个。我认为这意味着我无法使用Semaphores或ReentrantLock或任何需要锁定的解决方案。最终,我要完成的工作是,当“灯”为绿色时,允许调用doSomeWorkIfLightIsGreen()
的任何线程成功执行,而当“灯”为红色时,则完全不允许任何线程执行。