package kr.debop4j.core.guava.concurrency; import com.google.common.util.concurrent.Monitor; import java.util.concurrent.atomic.AtomicInteger; /** * kr.debop4j.core.guava.concurrency.MonitorExample * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 12. 12. 10. */ public class MonitorExample { private final Monitor monitor = new Monitor(); private volatile boolean condition = true; private int taskDoneCounter; private AtomicInteger taskSkippedCounter = new AtomicInteger(0); private int stopTaskCount; private Monitor.Guard conditionGuard = new Monitor.Guard(monitor) { @Override public boolean isSatisfied() { return condition; } }; public void demoTryEnterIf() throws InterruptedException { if (monitor.tryEnterIf(conditionGuard)) { try { simulatedWork(); taskDoneCounter++; } finally { monitor.leave(); } } else { taskSkippedCounter.incrementAndGet(); } } private void simulatedWork() throws InterruptedException { Thread.sleep(250); } public void reEvaluateGuardCondition() { try { monitor.enterWhen(conditionGuard); } catch (InterruptedException ignored) { } } public int getStopTaskCount() { return stopTaskCount; } public void setStopTaskCount(int stopTaskCount) { this.stopTaskCount = stopTaskCount; } public void setCondition(boolean condition) { this.condition = condition; } public int getTaskSkippedCounter() { return taskSkippedCounter.get(); } public int getTaskDoneCounter() { return taskDoneCounter; } }