在java中创建只能在某些安全点杀死的守护进程'like'线程?

dso*_*len 4 java multithreading daemon shutdown

我继承的代码是一个服务器,它产生许多不同类型的守护程序线程,这些守护程序线程在它们进入时接收和响应请求.显然,这很危险,需要重构.现在,如果主程序在其中一个守护程序正在处理请求时停止,则该线程可能会在请求中途被杀死,并使某些内容处于不一致状态.

但是,有很多线程分布在代码的不同区域.如果在调用关闭时我不得不手动关闭每个线程,那么在不丢失一些模糊的守护进程的情况下获得逻辑流程可能会有点麻烦.

我想做的是拥有一个类似守护程序线程的线程,但我可以将线程的某些部分标记或切换为关键部分; 这将完成therad从收获到完成.虽然守护程序阻塞并等待请求,但它的行为类似于守护程序线程,但不会阻止VM关闭,并且如果VM正在关闭,它将立即停止.但是,当线程主动服务于特定请求时(线程处于活动状态的一小部分时间),线程将不会被杀死直到它完成并退出它的关键部分.一旦线程完成它的关键部分,它就有资格被杀死.理想情况下,当没有更多的非守护程序线程可用时,VM会立即启动它的关闭过程,即使某些守护程序仍在执行关键工作,也可以通过收集任何未处于临界状态的守护程序然后等待每个剩余的"守护程序"退出这是关键点所以它可能会被杀死.

有没有一种简单的方法来通过实例化一个Thread类(可能是我编写的一个)或设置一个布尔值来获得这种行为,而不是必须显式地编写每个线程来正确处理中断,使其表现得像这样?我正在寻找一种大多数傻瓜证明的方式,以便如果在这样的线程中运行的插件没有被写入以完美地处理中断,则线程仍将正确地完成它的关键部分,然后在VM关闭时退出.

Gra*_*ray 5

但是,有很多线程分布在代码的不同区域.如果在调用关闭时我不得不手动关闭每个线程,那么在不丢失一些模糊的守护进程的情况下获得逻辑流程可能会有点麻烦.

不幸的是,这样做的最好方法就是暗示.你应该destroy()在分叉线程的类上有一个方法,以便它们可以自己明确地清理.但这确实需要有人在应用程序终止时调用那些destroy方法.

我想要做的是拥有一个类似守护程序线程的线程,但是有一个关键部分,它在完成之前不能被杀死(或者如果它需要太长时间可能会超时?).

Java线程中没有任何内容允许此行为.线程是守护进程还是不守护进程,这是线程启动之前设置的.

有没有一种简单的方法来通过实例化一个类或设置一个布尔来获得这种行为

我想你在这里有所作为.我会有一个ThreadUtils带有volatile boolean shutdown字段的课程.

 public class ThreadUtils {
     private static volatile boolean shutdown = false;
     /** called by main when the application is shutting down */
     public static void shutdown() {
         shutdown = true;
     }
     /** used by the various non-daemon threads to test for shutdown */
     public static boolean isShutdown() {
         return shutdown;
     }
 }
Run Code Online (Sandbox Code Playgroud)

您的主程序会将shutdown标志设置为true,然后您的所有线程都需要在其代码中检查此布尔值:

 // we can test for shutdown only at "appropriate" points in the thread
 while (!ThreadUtils.isShutdown()) {
     ...
     // we are not ready to be killed here
     ...
 }
Run Code Online (Sandbox Code Playgroud)

像这种模式,虽然有点粗糙,听起来像它满足你的要求.