如果是web項(xiàng)目,會(huì)啟動(dòng)端口監(jiān)聽,主線程阻塞不會(huì)退出。但如果是普通的java項(xiàng)目對(duì)外提供服務(wù),主線程一旦跑完,整個(gè)進(jìn)程就退出了。
之前見過有使用死循環(huán)方式來防止退出的。著實(shí)捏了把冷汗,這會(huì)導(dǎo)致cpu占用變高。那有沒有更優(yōu)雅的方式呢,我從阿里開源RPC框架dubbo中找到了答案
public class StartMain {
private static final ReentrantLock LOCK = new ReentrantLock();
private static final Condition STOP = LOCK.newCondition();
public static void main(String[] args) {
AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
applicationContext.start();
logger.info("service start success !~");
addHook(applicationContext);
//主線程阻塞等待,守護(hù)線程釋放鎖后退出
try {
LOCK.lock();
STOP.await();
} catch (InterruptedException e) {
logger.warn(" service stopped, interrupted by other thread!", e);
} finally {
LOCK.unlock();
}
}
/**
* Created on 2017年12月12日
* <p>
* Discription:[添加一個(gè)守護(hù)線程]
*
* @param applicationContext
*
*/
private static void addHook(AbstractApplicationContext applicationContext) {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
applicationContext.stop();
} catch (Exception e) {
logger.error("StartMain stop exception ", e);
}
logger.info("jvm exit, all service stopped.");
try {
LOCK.lock();
STOP.signal();
} finally {
LOCK.unlock();
}
}, "StartMain-shutdown-hook"));
}
}