将java线程池中的线程作为守护程序线程存在任何问题

时间:2012-06-07 11:33:14

标签: java threadpool

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

将线程池中的线程作为守护进程是否有任何缺点。我了解守护程序线程,当JVM退出时,这些线程永远不会被正常清理,任何运行的东西都无法正常完成。此问题仅在关闭阶段。

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

2 个答案:

答案 0 :(得分:1)

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

  1. 请求关闭(通过System.exit()或发送到JVM进程的信号)。
  2. 您的关闭挂钩和WebLogic的关闭挂钩执行。
  3. 经过一段时间的超时(我认为5-10秒),WebLogic的一个关闭挂钩调用System.halt()。
  4. 无论关闭挂钩是否已完成,JVM都会终止。

答案 1 :(得分:1)

请参考以下链接,我建议同时使用java 7线程

http://www.baptiste-wicht.com/2010/09/java-concurrency-part-7-executors-and-thread-pools/

享受