多线程在测试中杀死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中的线程?如果没有,我有没有其他方法可以实现我的目标
谢谢, 安德烈
# 1 楼答案
您可以使用带有超时的ScheduledExecutorService:
可能需要一些改进,但你得到了基础
# 2 楼答案
使用
Thread.currentThread().getThreadGroup()
遍历Thread.stop
是蛮力方式,但在您的情况下,如果调用Thread.interrupt
-edit,它可能会起作用-我读得太快了,还以为您在生成的线程中调用了sleep。重读一遍,我看到你只是在你的主线程中做这件事,所以Real怀疑论者在这篇文章中评论说,不确定而且可能不太可能interrupt
解决这个问题