我有一个场景,我在java中运行不可靠的代码(场景与this不同)。我提供了框架类,目的是让第三方覆盖一个名为doWork()的基类方法。但是,如果客户端doWork()进入funked状态(例如无限循环),我需要能够终止worker。
大多数解决方案(我发现this example和this example)围绕一个易失性布尔值的循环检查:
while (keepRunning) {
//some code
}
或检查中断状态:
while (isInterrupted()) {
//some code
}
但是,这些解决方案都没有在' //某些代码'中处理以下内容。部分:
for (int i = 0; i < 10; i++) {
i = i - 1;
}
我理解thread.stop()被折旧的原因,显然,运行错误的代码是不可取的,尽管我的情况迫使我运行代码我无法验证自己。但我发现很难相信Java没有一些机制来处理进入不可接受状态的线程。所以,我有两个问题:
是否可以在Java中启动可以被可靠杀死的Thread或Runnable?或者Java是否需要协作多线程才能使线程有效地管理系统?
如果没有,可以采取哪些步骤来传递活动对象,以便代码可以在进程中运行(例如传递活动网络连接),我可以实际杀死它。?
< / LI> 醇>答案 0 :(得分:0)
如果你真的不想(或者可能因为传递网络连接的要求而不能)产生新进程,你可以尝试在加载它的类时检测这个'插件'的代码。我的意思是更改它的字节码,因此它将包含对某些实用程序方法的静态调用(例如ClientMentalHealthChecker.isInterrupted())。实际上并不难做到。在这里,您可以找到一些可能有用的工具:https://java-source.net/open-source/bytecode-libraries。它不会是防弹,因为还有其他阻止执行的方法。另请注意,客户端代码可以捕获InterruptedExceptions。