【问题标题】:Is there any issue in making threads in a java threadpool as daemon threads将java线程池中的线程作为守护线程是否有任何问题
【发布时间】:2012-06-11 11:01:33
【问题描述】:

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

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

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

【问题讨论】:

  • 与守护线程相关的问题将与这些线程实际执行的操作有关。只有你知道这些线程执行什么任务。
  • 你看过Work Managers
  • @mprabhat 谢谢。我需要一个具有一些非常具体的自定义功能的线程池。所以不能使用工作管理器。
  • 假设你还没有看过最后一个例子here

标签: java threadpool


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    享受

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多