【发布时间】:2016-06-25 13:24:52
【问题描述】:
我正在尝试设置我的 java 代码,以便它可以在任何代码执行点后停止。
我正在考虑将我的所有代码放在一个线程中,并在我希望它停止时调用Thread.interrupt()。请注意,如果正在运行任何线程阻塞方法(如 sleep、join、wait 等),此方法只会导致代码抛出 InterruptedException。否则它只会设置中断标志,我们必须在每一行之后通过isInterrupted()检查它。
所以现在我需要做的就是插入以下代码...
if (myThread.isInterrupted()) {
System.exit(0);
}
在每一行代码之后。如果我的 java 代码存储在 String 中,我如何在代码的每个执行点之后插入这行代码?
我正在考虑在分号上使用 split 方法并在结果数组中的每个元素之间插入线程代码,但它不起作用,因为例如 for 循环有分号不代表语句的结尾.我想我也必须在右花括号上分开,因为它也代表代码语句的结尾。
编辑:解决方案尝试:
final String javaCode = "if (myString.contains(\"foo\")) { return true; } int i = 0;";
final String threadDelimiter = "if (thisThread.isInterrupted()) { System.exit(0); }";
final StringBuffer sb = new StringBuffer();
for (int i = 0; i < javaCode.length(); i++) {
final char currChar = javaCode.charAt(i);
sb.append(currChar);
if ("{};".contains(currChar + "")) {
sb.append(threadDelimiter);
}
}
System.out.println(sb);
这段代码几乎是正确的,但它不适用于任何使用分号的循环。它也不适用于没有大括号的 for 循环。
【问题讨论】:
-
"我正在尝试设置我的 java 代码,以便它可以在任何代码执行点后停止。" - 什么?为什么?您是否正在尝试调试某些东西?如果是这样,您可以使用调试器暂停并逐行执行您的程序。否则,你的目标是什么?只需发送
SIGINT就足以让您的程序退出。 -
你到底为什么要在每一行代码之后这样做。代码运行速度很快,所以只做一个关键点,例如在长时间运行的循环开始时,等等。是否需要再过 0.000001 秒才被中断,这没关系,不是吗? 仅供参考:我的机器可以在 0.000001 秒内运行 200 条简单语句。
-
我想要可中断的 java 代码,以防我得到长时间运行的 java 代码,我希望能够在经过一定时间后立即停止。另外,我不是在尝试调试代码。我得到了要运行的代码,我需要能够随时中断它。
-
@Andreas 你不知道我将要运行什么语句。我可能会得到进行大量 api 调用、数据库查询等的代码。你的机器的速度是无关紧要的。
-
向您的程序发送
SIGINT或SIGTERM,它会立即退出。