使用Guava Monitor进行并发服务协调

时间:2015-11-16 23:01:19

标签: java multithreading guava

我有一组服务,它们在一个线程池中并发运行,并由ServiceGroup管理。它们被实现为具有闭环的Runnables。其中一项服务是Validator,在允许其他服务启动之前必须完成至少一个循环。

等待验证'情况可以通过一个简单的while循环解决,但我试图更好地了解Google Guava监视器和警卫,想知道这些是否可以使用。

我的代码的粗略概述是:

public class ServiceGroup implements Runnable {

    private ThreadPoolExecutor taskExecutor = ...;
    private Validator validator = ...;
    private final Monitor monitor = new Monitor();

    public void run(){
        taskExecutor.execute(validator);
        monitor.enterWhen(isValidatorRunOnce);
        try{
            taskExecutor.execute(new MyService());
            taskExecutor.execute(new MyService());
            taskExecutor.execute(new MyService());
            doManagementOperations();
        }finally{
            monitor.leave();
        }
    }

    private final Monitor.Guard isValidatorRunOnce = new Monitor.Guard(monitor) {
        @Override
        public boolean isSatisfied() {
            return validator.isValidationRunOnce();
        }
    }
}

执行代码时,验证器会被调高。守护者isValidatorRunOnce被调用一次,因为第一个验证循环尚未完成,所以返回false。除此之外,验证器仍然成功运行其循环,但主线程一直在监视器后面等待,从不再次运行检查,也从不进入try / catch块。

我认为问题是当Validator完成工作并且应该重新评估Guard时,需要通知监视器吗?我期待着卫队继续检查条件本身没有任何触发器。我可以使用任何建议来解释我对监视器的误解,以及如何更好地解决这种情况。

谢谢

0 个答案:

没有答案