2012-06-07 46 views
1

我在Weblogic server (WLS)内启动了一个Java线程池ThreadPoolExecutor(具有核心池大小)。要正常关闭池,我需要在该池上调用shutdown()。但由于我无法控制的原因,我无法在此WLS中添加任何应用程序生命周期侦听器,这意味着我没有任何关闭钩子来调用此方法。 所以我正在考虑将池中的线程作为守护进程线程,以便WLS JVM不会等待这些线程在关闭时完成。否则JVM将不会正常关闭,因为池中的核心线程始终在运行。将java线程池中的线程作为守护程序线程是否存在任何问题

将线程池中的线程作为守护进程存在任何缺点。我了解守护线程,当JVM退出时,这些线程永远不会被正常清理,任何正在运行的东西都不会正常完成。这个问题只在关机阶段。

在线程池中创建线程守护进程还有其他问题吗? (或更好的方法)

+0

相关守护进程线程的问题会涉及到什么这些线程实际上做。只有你知道这些线程执行什么任务。 –

+0

[关于守护线程利弊的一些想法](http://stackoverflow.com/search?tab=relevance&q= [java]%20why%20use%20daemon%20threads) – assylias

+0

你看了[工作经理]( http://docs.oracle.com/cd/E15051_01/wls/docs103/config_wls/self_tuned.html) – mprabhat

回答

1

鉴于您处于应用程序容器中,您可能希望将工作管理器用作@mprabhat的建议。但是如果你确实需要受你控制的线程,你仍然可以关闭它们。 WebLogic通过关闭挂钩实现应用程序生命周期通知。而且这种机制仍然适用于您。您可以使用Runtime.addShutdownHook注册一个。不要忘记,要尽快完成你的工作。的WebLogic有超时,所以关闭顺序基本上是:

  1. 关断请求(通过System.exit()的或发送到JVM处理的信号)。
  2. 执行关闭挂钩和WebLogic的关闭挂钩。
  3. 经过一段时间(5-10秒,我想)WebLogic的关闭钩子之一调用System.halt()。
  4. 不管关闭钩子是否完成,JVM都会终止。