有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程在测试中杀死java线程

我正在写一篇关于编程的教程(这将是github上的Java repo),用户可以克隆repo并在空方法中编写自己的代码来解决算法问题。在编写代码之后,他们可以启动单元测试来检查他们的解决方案是否正确,以及它是否在一定时间内完成执行(以确保找到最有效的解决方案)。 因此,我的repo将包含许多带有空方法的类和所有非空单元测试,以检查用户将编写的代码

我在JUnit测试中所做的是这样的:

// Problem.solveProblem() can be a long running task
Thread runner = new Thread(() -> Problem.solveProblem(input)); 

runner.start();

try {
    Thread.currentThread().sleep(500);
}
catch (InterruptedException e) {
    e.printStackTrace();
}

if (runner.isAlive()) {
    fail("Your algorithm is taking too long.");
    runner.stop();
}

现在,如果用户编写了一个未优化的算法,测试将正确失败,但是runner线程将继续运行(测试线程也将继续运行),直到它终止为止,这可能在几分钟后发生,尽管我调用了running.stop()。所以我的测试可以持续几分钟而不是几秒钟

我知道如何优雅地终止Java中的线程,但在这种情况下,我不希望用户处理多线程问题(比如检查/更新共享变量):我只希望他们只编写代码来解决问题

所以我的问题是:有没有一种方法可以突然终止Java中的线程?如果没有,我有没有其他方法可以实现我的目标

谢谢, 安德烈


共 (2) 个答案

  1. # 1 楼答案

    您可以使用带有超时的ScheduledExecutorService

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 
    Future<?> future = executor.schedule(() -> Problem.solveProblem(input));
    try {
        future.get(500, TimeUnit.MILLISECONDS);
    } catch (Exception e){
        fail("Your algorithm is taking too long.");
        future.cancel(true);
    }
    

    可能需要一些改进,但你得到了基础

  2. # 2 楼答案

    使用Thread.currentThread().getThreadGroup()遍历Thread.stop是蛮力方式,但在您的情况下,如果调用Thread.interrupt-edit,它可能会起作用-我读得太快了,还以为您在生成的线程中调用了sleep。重读一遍,我看到你只是在你的主线程中做这件事,所以Real怀疑论者在这篇文章中评论说,不确定而且可能不太可能interrupt解决这个问题