3

我创建了一个编辑器,它具有 java 源文件的编译和运行选项。问题是,当我通过反射运行具有无限循环的方法时,编辑器挂起......

        Method thisMethod = thisClass.getDeclaredMethod("main", String[].class);
        thisMethod.invoke(null, (Object) new String[0]);  

如果 main 方法有无限循环,例如:

        public static void main(String[] args) {
             while(true)
             System.out.println("loop ");
        }

然后我必须从任务管理器中明确退出编辑器。

我想添加一个功能,如果它发生无限循环,它会强制停止程序的运行。

那么,如何停止具有无限循环的正在运行的方法呢?

4

2 回答 2

2

在单独的进程中运行代码(并在用户厌倦等待时提供一个按钮来终止进程)将是最直接的方法。

如果您只有一个进程并且在单独的线程中运行此代码,那么这不是很好。没有线程的合作,没有通用的安全方法来停止线程,除非您使用不推荐使用的停止方法。使用单独的进程将保持分离并限制用户程序可能对您的编辑器造成的损害。用户可以选择与您的编辑器用来运行的JVM不同的JVM,并且您的类加载器与用户代码使用的类加载器保持分离。

为此,您将使用 ProcessBuilder 创建一个新进程并运行它,确保从其 stdout 和 stderr 流中读取。(无论如何,您都希望这样做以向用户显示输出,但如果您让缓冲区填满,该过程将挂起。)

于 2014-01-16T18:22:16.590 回答
1

您可以从 java8 尝试 ExecutorService。

    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(() -> {
        while(true)
        System.out.println("loop ");

    });
    executor.awaitTermination(10, TimeUnit.SECONDS);
于 2015-07-10T10:34:17.093 回答