外部结束无限循环 java

externally ending infinite loop java

我正在编写一个程序来标记一组学生提交的算法。我打算将他们的算法方法复制到程序中并 运行 运行它以查看结果;但是,要求算法不运行超过10秒。

我构建了一个 ExecutorService 来结束适用于 userInput 算法(已注释掉)但不适用于无限循环的算法。

根据我对线程的了解,中断它需要更改算法(添加标志),并且停止线程是贬值的,那么有没有其他方法可以在不更改算法的情况下结束无限循环?

代码如下:

public class TestAlgo{
private String move;

public static void main(String[] args){
    TestAlgo testAlgo = new TestAlgo();
    testAlgo.runGame();
}

public void runGame(){
    Cram game = new Cram();
    boolean start = game.startGame();


    while (start){
        ExecutorService executor = Executors.newSingleThreadExecutor();/////
        Future<String> future = executor.submit(new Task());/////
        move = "";
        try {
            System.out.println("Started..");
            move = future.get(10, TimeUnit.SECONDS);
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            move = "Timeout";
            System.out.println("Terminated!");
        } catch (InterruptedException ie){
            System.out.println("Error: InterruptedException");
        } catch (ExecutionException ee){
            System.out.println("Error: ExecutionException");
        }
        System.out.println("Move: " + move);
        executor.shutdownNow();



        if (game.sendMove(move)) break;
        game.printBoard();
        if (game.getMove()) break;
        game.printBoard();
    }
}

// public static String algorithm(){
//     while (true){ //infinite loop
//         System.out.println("Algo is running...");
//     }
//     return "test";
// }

public static String algorithm(){
    Scanner userInputScanner = new Scanner(System.in);
    System.out.print("Please enter your move: ");
    String input = userInputScanner.nextLine();
    return input;
}}

class Task implements Callable<String> {
@Override
public String call() throws Exception {
    String move = TestAlgo.algorithm();
    return move;
}}

您可以在 while 循环中完成您的话题:

public static String algorithm(){
    long start = System.currentTimeMillis();
    long end = start + 10*1000; // 10 seconds?
    while (System.currentTimeMillis() < end){ //not-so-infinite loop
         System.out.println("Algo is running...");
    }
    return "test";
}

但是如果你不想修改algorithm()方法,你可以检查this, or this

作为 运行 JVM 线程中不受信任代码的替代方法,请考虑使用 ProcessBuilder 启动一个单独的进程。然后,您可以使用 Process destroyForcibly 方法终止它。

Google Guava's SimpleTimeLimiter 应该有帮助。只需将 ExecutorService 包裹在 SimpleTimeLimiter 中,然后使用 callWithTimeout 方法指定给定的超时时间;处理 UncheckedTimeoutException 以指示已达到超时。最后,调用包裹在SimpleTimeLimiter.

中的ExecutorServiceshutdown方法