Java守护程序 - 处理关闭请求

时间:2009-12-07 23:16:57

标签: java multithreading daemon shutdown

我目前正在开发一个守护程序,它将完成很多不同的任务。它是多线程的,用于处理几乎任何类型的内部错误而不会崩溃。好吧,我已经到了处理关机请求的程度,我不确定应该怎么做。

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

我现在想做的是当发送一个关闭钩子时,在ThreadGroup.activeCount()上用500ms(左右)睡眠做一个5秒的循环(所有这些线程都在ThreadGroup中) )在此循环之前,我将向所有线程发送通知,告诉他们已经调用了关闭请求。然后他们将不得不立即进行清理和关闭。

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

由于

2 个答案:

答案 0 :(得分:2)

java.util.concurrent package提供了许多实用程序,例如ThreadPoolExecutor(以及Executor类中的各种特殊类型的其他Executors实现)和ThreadPoolExecutor.awaitTermination()你可能想要研究它们 - 因为它们提供了你想要实现的完全相同的功能。这样,您可以专注于实现应用程序/任务的实际功能,而不必担心线程和任务调度等问题。

答案 1 :(得分:1)

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

同样,如果您依赖于ExecutorService#submit()生成的Future,则可以使用Future#cancel(boolean)并传递true来请求中断正在运行的作业。< / p>

除非您调用控制中的代码吞下中断信号(例如,通过在不调用InterruptedException的情况下捕获Thread.currentThread().interrupt()),否则使用内置协作中断工具是一个更好的选择。引入你自己的旗帜来估计那里已有的东西。