阅读后抛出守护进程线程并根据我的要求实现提出了几个疑问。 请澄清我
我正在使用ServletContextListener类来调用需要运行unitl JVM退出的守护进程线程
public void contextInitialized (ServletContextEvent event) {
context = event.getServletContext();
//getting from spring context
MyServiceManager serviceManager = (MyServiceManager) ctx.getBean("myServiceManager");
serviceManager.setDaemon(true);
serviceManager.start();
}
我运行一个无限循环来运行程序,直到JVM存在
public void run() {
try {
startService();
} catch (Exception e) {
logger.error("Error Occured in Background Process Runner");
}
}
private void startService(){
while(true){
try{
//invoke some new threads and do processing jobs until server/jvm stops
}catch(Exception e) {
//log but don't quit
}
}
}
}
值得关注的是,具有上述命令的守护程序线程是否会运行?如果没有,我该怎么做才能完成我的工作。除非JVM停止(服务器停止),否则告诉它不要退出。
注意:我正在尝试使用此级别来格式化此帖子。但今天有些事情发生了,它没有被格式化:(
答案 0 :(得分:4)
您的守护程序线程将一直运行,直到run()
方法终止,通过正常退出或抛出异常(或直到VM退出,这是您想要的)。由于您捕获startService()
抛出的所有异常,它将一直运行直到startService()
返回或抛出异常,然后才会正常退出。
请注意,如果startService()
在等待I / O,休眠或处于等待状态时被中断,那么它通常会抛出InterruptedException
。行为良好的线程通常在被中断时退出,因为这是告诉线程退出的常用方法。
请注意,将线程标记为守护程序仅意味着VM在关闭之前不会等待线程退出。关于线程终止的其他任何行为都不会受到作为守护程序的线程的影响。