java - 在测试中杀死一个java线程

标签 java multithreading junit

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

我在 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中的线程?如果没有,我可以采取任何其他方法来实现我的目标吗?

谢谢, 安德里亚

最佳答案

您可以使用 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);
}

可能需要一些改进,但您已经掌握了基础知识。

关于java - 在测试中杀死一个java线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41226054/

相关文章:

java - 在 Java 中解析 XML 多行字符串

java - 检查当前是否显示锁屏

c# - 内联任务何时发生?

java - 使用 PhantomJSDriver 的 Selenium 测试挂起且未完成

java - 安卓 JUnit : How to have an exception cause a test case to pass (@Test annotation)

java - 如何更改 Intellij IDEA 中的默认测试框架?

java - 线程中的异常 "main"java.lang.IndexOutOfBoundsException : Index: 10, 大小:0

java - 我如何检测 Java 中图像(透明背景)的边缘?

multithreading - 哪些 perl 内置函数是原子的?

Python、solr 海量查询 : need some suggestions