gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:10:50 26 4
gpt4 key购买 nike

我继承的代码是一个服务器,它产生许多 不同类型的守护线程,这些线程在请求​​进入时接收并响应它们。显然,这是危险的,需要重构。就像现在一样,如果主程序在其中一个守护进程正在为请求提供服务时停止,线程可能会在请求中途被终止,并使某些东西处于不一致的状态。

但是,有相当多的线程分布在代码的不同区域。如果我必须在调用关闭时手动关闭每个线程,那么在不遗漏一些晦涩的守护进程的情况下完美地实现逻辑流可能会有点痛苦。

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

是否有一种简单的方法可以通过实例化 Thread 类(可能是我编写的类)或设置 boolean 值来获得此行为,而不必显式编写每个线程以正确处理中断以实现这种行为?我正在寻找一种最白痴的证明方法,这样如果在这样的线程中运行的插件没有被编写为完美地处理中断,线程仍然会正确地完成它的关键部分,然后在 VM 关闭时退出。

最佳答案

However, there are quite a few threads spread through different areas of the code. If I had to manually close every one of the threads when a shutdown is called, well it could be a bit of a pain to get logic flow perfect without missing some obscure daemon.

不幸的是,最好的方法就是如您所暗示的那样。您应该在派生线程的类上有一个 destroy() 方法,这样它们就可以明确地自行清理。但这确实需要有人在应用程序终止时调用那些销毁方法。

What I would like to do instead is to have a thread that is like a daemon thread, but has a certain critical section where it cannot be killed until it completes (or maybe times out if it takes too long?).

Java 线程中没有任何东西允许这种行为。线程要么是守护进程,要么不是,这是在线程启动之前设置的。

Is there an easy way to get this behavior just by instantiating a class or setting a Boolean

我认为您在这里有所作为。我会有一个带有 volatile boolean shutdown 字段的 ThreadUtils 类。

 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;
}
}

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

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

类似这种模式,虽然有点恶心,但听起来可以满足您的要求。

关于java - 在java中创建只能在某些安全点被杀死的守护进程 'like'线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18922707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com