【问题标题】:Java daemon - handling shutdown requestsJava daemon - 处理关闭请求
【发布时间】:2009-12-07 23:16:57
【问题描述】:

我目前正在开发一个守护进程,它将执行很多不同的任务。它是多线程的,并且正在构建以处理几乎任何类型的内部错误而不会崩溃。好吧,我快要处理关闭请求了,但我不确定我应该如何去做。

我有一个关闭挂钩设置,当它被调用时,它会设置一个变量,告诉主守护程序循环停止运行。问题是,这个守护进程产生了多个线程,它们可能需要很长时间。例如,这些线程之一可能正在转换文档。他们中的大多数会很快(我猜不到 10 秒),但会有一些线程可以持续长达 10 分钟以上。

我现在想做的是,当关闭钩子被发送时,在 ThreadGroup.activeCount() 上循环 5 秒左右,睡眠时间为 500 毫秒(左右)(所有这些线程都在 ThreadGroup 中) 在此循环之前,我将向所有线程发送通知,告诉它们已调用关闭请求。然后,无论他们在做什么清理和关闭,他们都必须立即进行。

其他人有什么建议吗?我对像 MySQL 这样的守护进程在被告知停止时会做什么感兴趣,它会立即停止。如果正在调用 10 个运行速度非常慢的查询,会发生什么情况?它是等待还是只是结束它们。我的意思是服务器真的很快,所以真的没有任何类型的操作我不应该在不到一秒的时间内完成。现在你可以在 1000 毫秒内做很多事情。

谢谢

【问题讨论】:

    标签: java multithreading daemon shutdown


    【解决方案1】:

    java.util.concurrent package 提供了许多实用程序,例如ThreadPoolExecutor(以及来自Executors 类的各种特殊类型的其他Executor 实现)和ThreadPoolExecutor.awaitTermination(),您可能想研究一下 -因为它们提供了与您希望实现的完全相同的功能。通过这种方式,您可以专注于实现应用程序/任务的实际功能,而不必担心线程和任务调度之类的事情。

    【讨论】:

    • 我最初使用的是 ThreadPoolExecutor 并最终将其更改为其他内容。处理线程等工作正常。我已经将它设置为关闭线程,我的问题是我不喜欢必须立即关闭并告诉我的线程停止的想法。问题是,如果程序需要关闭,则无法解决。我想我在寻找魔法。我会将其设置为已接受,因为我的问题不是很具描述性。谢谢!
    • 当你收到关闭信号时调用awaitTermination()并在超时时终止线程(使用shutdown())怎么办?是否需要在一定时间段内处理关机?
    • 不,我只是希望它快一点,因为如果服务器正在关闭,或者正在发生某些事情,延迟并不是那么好。我想我要向所有线程发送一个调用,告诉他们是时候关闭了,他们都有大约 3 秒的时间来完成,如果他们不这样做,我会杀死他们并退出。我想我正在寻找一种魔法“让时间暂停,让我完成线程,然后回到现实世界”。 :) 谢谢你们的帮助!
    【解决方案2】:

    您的线程作业是否可以通过Thread#interrupt() 中断?他们是否主要调用自己宣传投掷InterruptedException 的函数?如果是这样,那么前面提到的java.util.concurrent.ExecutorService#shutdownNow() 就是要走的路。它将中断所有正在运行的线程并返回从未启动的作业列表。

    同样,如果你挂在ExecutorService#submit()产生的Futures,你可以使用Future#cancel(boolean)并传递true来请求中断正在运行的作业。

    除非您调用的代码超出您的控制范围并吞下中断信号(例如,通过捕获 InterruptedException 而没有调用 Thread.currentThread().interrupt()),否则使用内置的协作中断工具比引入您自己的标志更好的选择估计已经存在的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 2019-01-17
      相关资源
      最近更新 更多