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