Java 使守护进程线程运行到JVM退出
在阅读了throw守护进程线程并按照我的要求实现之后,我提出了一些疑问。 请澄清Java 使守护进程线程运行到JVM退出,java,multithreading,daemon,background-process,Java,Multithreading,Daemon,Background Process,在阅读了throw守护进程线程并按照我的要求实现之后,我提出了一些疑问。 请澄清 我使用ServletContextListener类来调用需要运行unitl JVM出口的守护进程线程 public void contextInitialized (ServletContextEvent event) { context = event.getServletContext(); //getting from spring context MyServiceMana
public void contextInitialized (ServletContextEvent event) {
context = event.getServletContext();
//getting from spring context
MyServiceManager serviceManager = (MyServiceManager) ctx.getBean("myServiceManager");
serviceManager.setDaemon(true);
serviceManager.start();
}
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
}
}
}
}
注意:我正在尽我最大的努力来格式化这篇文章。但是今天有些事情发生了,它没有被格式化:(你的守护进程线程将一直运行,直到
run()
方法终止,或者正常退出,或者抛出异常(或者直到VM退出,这是你想要的)。因为你捕获了startService()抛出的所有异常)
,它将一直运行,直到startService()
返回或抛出异常,然后将正常退出
请注意,如果startService()
在等待I/O、休眠或处于等待状态时被中断,则它通常会抛出InterruptedException
。行为良好的线程通常在中断时退出,因为这是通知线程退出的正常方法
请注意,将线程标记为守护进程只意味着VM不会等到线程退出后再关闭。关于线程终止的其他行为都不受线程是否为守护进程的影响。守护进程线程将运行到
run()为止
方法通过正常退出或抛出异常终止(或直到VM退出,这是您想要的)。由于捕获了由startService()
引发的所有异常,因此它将运行直到startService()
返回或抛出异常,然后正常退出
请注意,如果startService()
在等待I/O、休眠或处于等待状态时被中断,则它通常会抛出InterruptedException
。行为良好的线程通常在中断时退出,因为这是通知线程退出的正常方法
请注意,将线程标记为守护进程只意味着VM不会等到线程退出后再关闭。线程是否为守护进程不会影响线程终止的任何其他行为。实际上startService块在循环中包装了整个try-catch异常。它不会抛出任何异常因此,我猜想守护进程线程应该永远运行。当服务器停止或JVM关闭时会发生什么。DeAMon线程应该被正确地杀死。如果不是,可以从Servlet的上下文破坏方法杀死它吗?@ NITIGURURRAM——当JVM关闭时,所有线程停止。注意,I/O中间的守护进程线程可以在没有BEE的情况下停止。ng提供了一个正确清理的机会。如果需要给守护程序线程一个清理的机会,您应该注册一个。该方法的文档有关闭过程的详细描述。实际上startService块在循环中有一个整体的try-catch异常。它不会抛出任何异常。所以我想守护程序线程应该当服务器停止或JVM关闭时会发生什么。DeAMon线程应该被正确地杀死。如果不是,可以从Servlet的上下文破坏方法中杀死它吗?@ NITIGURURRAM——当JVM关闭时,所有线程停止。注意,I/O中间的守护进程线程可以停止,而不必有机会清理PROP。如果你需要给守护进程一个清理的机会,你应该注册一个。该方法的文档有关闭过程的详细描述。