我需要限制一个具有零循环的长时间运行功能。我使用Callable
运行该函数,并在未来使用超时值调用get
。 AFAIU,future.cancel(true)
将为函数线程设置中断标志。但除非我检查并处理longRunningFunction()
中的Thread.isInterrupted(),否则我的代码将不知道它必须退出,即使在shutdownNow()
之后该函数也不会终止。
longRunningFunction()
中断?检查需要提示,即如果检查放在特定点,那么直到这些点被击中,线程将不会处理中断。public class Test {
public void longRunningFunction() {
/*
Long running code without loop
*/
}
public Void call() {
try {
longRunningFunction()
} catch (InterruptedException exception) {
logger.error("{} Error : {}", TAG, exception.getStackTrace().join("\n"))
} catch (Exception exception) {
logger.error("[call]{} Error : {}", TAG, exception.getStackTrace().join("\n"))
}
}
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor()
Future<Void> future = executor.submit(new Test())
int timeoutSeconds = 5
println "Setting timeout to " + timeoutSeconds
try {
future.get(timeoutSeconds, TimeUnit.SECONDS)
} catch (TimeoutException e) {
future.cancel(true)
logger.error("Could not finish processing within {} seconds", timeoutSeconds)
} finally {
executor.shutdownNow()
executor.awaitTermination(3, TimeUnit.SECONDS)
logger.error("Shutting down")
}
}
}
修改
与标记重复相关联的问题表明共享变量是要走的路,这是问题中提到的已知事实。问题是如何无缝地检查该布尔标志,即Thread.isInterrupted
。
答案 0 :(得分:1)
除了检查isInterrupted
标志之外的唯一方法是杀死线程,控制当前状态并以某种方式协调它。显然,您可以将其封装在一个类中,使其显示为已检查isInterrupted
标志。