使用场景:
系统启动时,需要校验网络、数据库、中间件等各种依赖环境,此时,可用CountDownLatch来做处理
BaseCheck:
package com.mhm.countdownLatch3;
import java.util.concurrent.CountDownLatch;
public abstract class BaseCheck implements Runnable {
private String serverName;
private CountDownLatch countDownLatch;
private boolean flag;
public BaseCheck(String serverName, CountDownLatch countDownLatch) {
this.serverName = serverName;
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
try {
System.out.println(serverName + "开始");
flag = docheck();
if (flag) {
System.out.println(serverName + "IS UP");
} else {
System.out.println(serverName + "IS DOWN");
}
} catch (Exception ex) {
flag = false;
ex.printStackTrace();
} finally {
countDownLatch.countDown();
}
}
public boolean isFlag() {
return flag;
}
protected abstract boolean docheck();
}
NetworkCheck:
package com.mhm.countdownLatch3;
import java.util.concurrent.CountDownLatch;
public abstract class BaseCheck implements Runnable {
private String serverName;
private CountDownLatch countDownLatch;
private boolean flag;
public BaseCheck(String serverName, CountDownLatch countDownLatch) {
this.serverName = serverName;
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
try {
System.out.println(serverName + "开始");
flag = docheck();
if (flag) {
System.out.println(serverName + "IS UP");
} else {
System.out.println(serverName + "IS DOWN");
}
} catch (Exception ex) {
flag = false;
ex.printStackTrace();
} finally {
countDownLatch.countDown();
}
}
public boolean isFlag() {
return flag;
}
protected abstract boolean docheck();
}
DatabaseCheck:
package com.mhm.countdownLatch3;
import java.util.concurrent.CountDownLatch;
public class DatabaseCheck extends BaseCheck {
public DatabaseCheck(String serverName, CountDownLatch countDownLatch) {
super(serverName, countDownLatch);
}
@Override
protected boolean docheck() {
try {
Thread.sleep(8000);
return true;
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
}
}
App3StartupUtils:
package com.mhm.countdownLatch3;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class App3StartupUtils {
private static List<BaseCheck> checkList;
private static CountDownLatch countDownLatch;
private static App3StartupUtils single = new App3StartupUtils();
public static App3StartupUtils getInstance() {
return App3StartupUtils.single;
}
public boolean checkService() throws InterruptedException {
checkList = new ArrayList<BaseCheck>();
countDownLatch = new CountDownLatch(2);
checkList.add(new NetworkCheck("网络校验", countDownLatch));
checkList.add(new DatabaseCheck("数据库校验", countDownLatch));
ExecutorService pool = Executors.newFixedThreadPool(checkList.size());
for (BaseCheck e : checkList) {
pool.execute(e);
}
countDownLatch.await();
for (BaseCheck e : checkList) {
if(e.isFlag()) {
} else {
return false;
}
}
pool.shutdown();
return true;
}
}
Main3:
package com.mhm.countdownLatch3;
public class Main3 {
public static void main(String[] args) {
try {
boolean flag = App3StartupUtils.getInstance().checkService();
System.out.println("启动:" + flag);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}