gpt4 book ai didi

java 创建非合作线程进行测试

转载 作者:行者123 更新时间:2023-12-01 04:21:40 24 4
gpt4 key购买 nike

我曾多次被一个无法配合并干净退出的java进程所困扰(它会被埋在一些不受我控制的低级库中)。我现在正在测试一种看门狗,它可以在某个预先设定的时间 ScheduledStop 实现进程的硬停止。该看门狗是一个单例类,它运行一个独立的线程,如果计划的停止时间到达,该线程将终止整个进程。通常,所有线程都应该在硬停止时间之前很好地返回,并且程序会正常退出。但是,如果有必要,进程会自行终止,释放文件锁等。所有这些都在 Linux 上运行。

我似乎记得即使是 System.exit(0) 也不是万无一失的(我认为如果某些关闭 Hook 被卡住,进程可能会保持 Activity 状态),所以我炮制了一些东西沿着这条线:

int pid = MyUtil.getPID();
Runtime.getRuntime().exec(new String[]{"kill", "-9", String.valueOf(pid)});

现在,我想使用一些真正不合作的线程来测试它,可能还使用一些出于测试目的而表现不佳的关闭 Hook 。

下面最初的 NastyThread 并不是那么令人讨厌...它忽略了 InterruptionException,但不会阻止 System.exit(0)。如何将我的虚拟机置于即使 exit() 也不会终止的状态?

另一个问题是,虽然看门狗线程理论上是独立的,但什么条件下其他线程会完全抢占它,从而破坏预定的停止?

如果有必要,我可以启动一个单独的进程(例如一个简单的 perl 脚本),在某个指定的时间杀死父进程(java 进程)。

/**
* A Runnable that runs forever and ignores InterruptedException.
*/
private static class NastyThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println("Received and ignoring "+e);
System.out.flush();
}
System.out.println(ScheduledStop.getInstance().toString());
}
}
}

最佳答案

您可以设置 SecurityManager 以在调用 System.exit() 时忽略或引发错误。

顺便说一句

while(true) Thread.yield();

for(;;);

也会忽略中断。

关于java 创建非合作线程进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18834050/

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