Как приостановить выполнение функции в логической переменной? - PullRequest
0 голосов
/ 26 марта 2019

Я, по сути, представляю "светофор" с зелеными и красными огнями. Когда индикатор горит зеленым, нам разрешено 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(), успешно выполнялся, когда «light» горит зеленым, но не позволял любому потоку вообще выполняться, когда «light» горит красным.

...