java.util.concurrent|CountDownLatch使用

CountDownLatch能实现让一个线程等待其他线程执行完成后再继续执行的功能。
如下使用CountDownLatch实现服务检测功能,ApplicationStartupUtil调用服务的检测方法,使用CountDownLatch等待检测完成,再返回检测结果。

BaseHealthChecker.java

/**
 * 外部服务心跳检测抽象类
 *
 * @Auothor wzx
 * @Date 2017/3/11 0011
 */
public abstract class BaseHealthChecker implements Runnable {

    private String serviceName;

    private boolean serviceUp;

    private CountDownLatch countDownLatch;

    public BaseHealthChecker(String serviceName, CountDownLatch countDownLatch) {
        super();
        this.serviceName = serviceName;
        this.countDownLatch = countDownLatch;
        this.serviceUp = false;
    }

    @Override
    public void run() {
        try {
            verifyService();
            serviceUp = true;
        } catch (Throwable e) {
            e.printStackTrace();
            serviceUp = false;
        } finally {
            if (countDownLatch != null) {
                //表示完成任务
                countDownLatch.countDown();
            }
        }
    }

    public String getServiceName() {
        return serviceName;
    }

    public boolean isServiceUp() {
        return serviceUp;
    }

    //子类实现具体检测方法
    public abstract void verifyService();
}

NetworkHealthChecker.java

/**
        * 网络健康检测
        * @Auothor wzx
        * @Date 2017/3/11 0011
        */
public class NetworkHealthChecker extends BaseHealthChecker {


    public NetworkHealthChecker(CountDownLatch countDownLatch) {
        super("Network Service", countDownLatch);
    }

    @Override
    public void verifyService() {
        System.out.println("checking " + this.getServiceName());
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(this.getServiceName() + " is up");
    }
}

NetworkHealthChecker.java

/**
 * 应用启动工具类
 *
 * @Auothor wzx
 * @Date 2017/3/11 0011
 */
public class ApplicationStartupUtil {

    //保存要检测的服务
    private static List<BaseHealthChecker> serviceList;

    private static CountDownLatch latch;

    private static final ApplicationStartupUtil instance = new ApplicationStartupUtil();

    public static ApplicationStartupUtil getInstance() {
        return instance;
    }

    private ApplicationStartupUtil() {

    }

    public static boolean checkExternalServices() throws InterruptedException {
        latch = new CountDownLatch(2);

        serviceList = new ArrayList<>();
        serviceList.add(new NetworkHealthChecker(latch));
        serviceList.add(new DatabaseHealthChecker(latch));

        Executor executor = Executors.newFixedThreadPool(serviceList.size());
        for (BaseHealthChecker healthChecker : serviceList) {
            executor.execute(healthChecker);
        }

        latch.await();

        for (BaseHealthChecker healthChecker : serviceList) {
            if(!healthChecker.isServiceUp()) {
                return false;
            }
        }
        return true;
    }

}

Main.java

/**
 * @Auothor wzx
 * @Date 2017/3/11 0011
 */
public class Main {

    public static void main(String[] args) {
        boolean result = false;
        try {
            result = ApplicationStartupUtil.checkExternalServices();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("External services validation completed !! Result was :: "+ result);
    }

}

参考
http://howtodoinjava.com/core-java/multi-threading/when-to-use-countdownlatch-java-concurrency-example-tutorial/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值