逐行执行Java

时间:2016-06-25 00:52:01

标签: java string

我正在尝试设置我的java代码,以便在任何代码执行后可能会停止它。

我正在考虑将所有代码放在一个线程中,并在我希望它停止时调用df = pd.DataFrame({'Name': ['A', 'B', 'C'], 'school': ['An', 'Bn', 'Bn']}) d = {'An': 'Bn', 'Bn': 'An'} df['school'] = df.school.map(d) >>> df Name school 0 A Bn 1 B An 2 C An 。请注意,如果正在运行任何线程阻塞方法,此方法将仅导致代码抛出Thread.interrupt()(如InterruptedExceptionsleepjoin等。否则它只会设置中断的标志,我们必须在每一行之后通过wait进行检查。

所以现在我需要做的就是插入以下代码......

isInterrupted()

每行代码之后。如果我的java代码存储在if (myThread.isInterrupted()) { System.exit(0); } 中,如何在我的代码执行的每个执行点之后插入这行代码?

我正在考虑在分号上使用split方法并在结果数组中的每个元素之间插入线程代码但是它不起作用,因为例如for循环有分号不代表语句的结尾。我想我也必须分开关闭花括号,因为它也代表了代码语句的结束。

编辑:解决方案尝试:

String

这段代码几乎是正确的,但它不适用于任何使用分号的循环。它也不适用于没有大括号的for循环。

1 个答案:

答案 0 :(得分:4)

首先,如果您的目标是触发System.exit(),则无需将此类调用注入另一个线程,然后中断该线程;只需拨打System.exit(),您就可以调用otherThread.interrupt();,然后该流程也会快速退出。

其次,您的计划无法实现目标。假设您在此语句周围添加了中断然后退出代码:

new Scanner(System.in).next();

如果没有向程序的stdin写入任何内容,则此语句将无限期地阻塞,并且不会尊重线程中断。有无数其他类似代码片段的例子会导致线程被阻塞。无论您注入多少粒度,都可能永远无法达到您的中断检查。

第三,将源代码操作为字符串是疯狂所在的路径。有exist标准工具可以将Java语法解析为可以安全操作的结构化数据类型。如果必须执行源代码操作,请使用正确的设备。

第四,没有特别的理由需要与源代码交互以简单地注入其他命令;编译源代码并使用bytecode injection直接注入命令。字节码的语法比Java源语言更有限,因此更容易推理和安全变异。

然而,除此之外,您根本不需要做任何此事

听起来你的目标是执行一些未知的Java代码片段,但能够随时停止进程。这完全您的操作系统旨在执行的操作 - 管理流程执行。为此,POSIX提供了几个标准signals,您可以优雅地(或不那么优雅地)将进程发送到进程以终止该进程。发送Java进程SIGINT Ctrl - C ),SIGTERMSIGHUP将导致JVM启动其关闭序列,有效地触发System.exit()

JVM shuts down

时会发生两个关键步骤
  

在第一阶段,所有已注册的关闭挂钩(如果有)都以某种未指定的顺序启动,并允许它们同时运行直到完成。在第二阶段,如果启用了退出终止,则运行所有未经调整的终结器。完成此操作后,虚拟机将暂停。

换句话说,只要您从prevent运行代码registering malicious shutdown hooks或调用runFinalizersOnExit()发送这些信号将导致JVM立即终止。

如果您的用例无法接受,请发送SIGKILL;操作系统将立即导致进程终止,而不给它机会运行关闭挂钩或终结器。您也可以从JVM中调用Runtime.halt()来完成大致相同的事情。