gpt4 book ai didi

java - 检查java中零循环线程中的中断

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:50:44 25 4
gpt4 key购买 nike

我需要对具有零循环的长时间运行的函数进行时间限制。我使用 Callable 运行该函数,并在未来使用超时值调用 get。 AFAIU,future.cancel(true) 将为函数线程设置中断标志。但是除非我检查并处理 longRunningFunction() 中的 Thread.isInterrupted(),否则我的代码将不知道它必须退出,甚至在 shutdownNow() 之后该函数将不终止。

  • 如何检查 longRunningFunction() 中的中断?检查需要及时,即如果检查是在特定点进行的,那么在命中这些点之前,线程将不会处理中断。
  • 有没有其他优雅的方式来实现时间限制功能?
  • 为什么我不能杀死执行程序池中的所有线程?根据 JavaDocs for ExecutorService在线程处理中断并自行终止之前,池永远不会终止。
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")
}
}
}

编辑链接到标记重复的问题表明共享变量是可行的方法,这是问题中提到的已知事实。问题是如何无缝检查该 boolean 标志,即 Thread.isInterrupted

最佳答案

除了检查 isInterrupted 标志之外的唯一方法是终止线程,控制当前状态并以某种方式协调它。您显然可以将其封装在一个类中,使其显示为已检查 isInterrupted 标志。

关于java - 检查java中零循环线程中的中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43390619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com