杀死Java线程而无需循环

时间:2018-12-31 15:09:42

标签: java timeout kill

我在项目中使用了一个外部库(Generex),一个构造函数可能需要很长时间才能执行,因此我希望有一个超时时间(例如50毫秒),并且能够知道是否已达到超时。

所以我在考虑使用专用线程,并编写了以下代码:

@Test
public void isComputable() throws InterruptedException {
    for (int i=0; i<10;i++)
        System.out.println(check());

    Thread.sleep(300000);
}

private static boolean check() {

    final Thread stuffToDo = new Thread(() -> {while(true){}});

    final ExecutorService executor = Executors.newSingleThreadExecutor();
    final Future future = executor.submit(stuffToDo);
    executor.shutdown();

    try {
        future.get(50, TimeUnit.MILLISECONDS);
    }
    catch (InterruptedException | ExecutionException | TimeoutException ie) {
        stuffToDo.interrupt();
        stuffToDo.stop();
        return false;
    }
    if (!executor.isTerminated())
        executor.shutdownNow();
    return true;
}

我用while(true)循环替换了对外部库的调用,但是需要注意的是,就我而言,我不能使用循环来检查线程是否被中断

执行此代码时,每次调用50毫秒后我的回答都很好,但是线程没有被破坏,并且CPU使用率很高,正如我们在JProfiler中所看到的(请注意,对我进行测试只是为了获得更好的图表):

enter image description here

请问有人对如何解决此问题有任何想法吗?

注意:我知道我不应该使用不赞成使用的stop方法,我只是尝试了所有我知道的方法来杀死线程。

1 个答案:

答案 0 :(得分:0)

您要么必须定期在代码callex中检查中断,要么必须在另一个进程中运行代码。这些是您中断或终止运行代码的进程的唯一方法。

我建议对长时间运行的线程进行堆栈跟踪,以帮助将来进行修复。