我有一组服务,它们在一个线程池中并发运行,并由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时,需要通知监视器吗?我期待着卫队继续检查条件本身没有任何触发器。我可以使用任何建议来解释我对监视器的误解,以及如何更好地解决这种情况。
谢谢