如何暂停布尔变量上函数的执行?

时间:2019-03-26 20:11:16

标签: java multithreading wait thread-sleep

我实质上是在设想一种具有绿灯和红灯的“交通灯”。当指示灯为绿色时,我们可以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()的任何线程成功执行,而当“灯”为红色时,则完全不允许任何线程执行。

0 个答案:

没有答案