我在项目中使用了一个外部库(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中所看到的(请注意,对我进行测试只是为了获得更好的图表):
请问有人对如何解决此问题有任何想法吗?
注意:我知道我不应该使用不赞成使用的stop方法,我只是尝试了所有我知道的方法来杀死线程。
答案 0 :(得分:0)
您要么必须定期在代码callex中检查中断,要么必须在另一个进程中运行代码。这些是您中断或终止运行代码的进程的唯一方法。
我建议对长时间运行的线程进行堆栈跟踪,以帮助将来进行修复。