gpt4 book ai didi

java - 为 java. util. ​​concurrent.ExecutorService 中的每个执行设置超时

转载 作者:行者123 更新时间:2023-11-30 06:32:30 26 4
gpt4 key购买 nike

如何使用 java. util. ​​concurrent.ExecutorService 为并行运行的每个命令创建超时?

我的代码是这样的:
例如,在下面的代码中,我需要 obj1 运行最多 1 分钟,obj2 运行 2 分钟,其他运行 5 分钟。

ExecutorService exService;
exService = Executors.newCachedThreadPool();
exService.execute(obj1);
exService.execute(obj2);
exService.execute(obj3);
exService.execute(obj4);
exService.shutdown();
boolean finshed = exService.awaitTermination(5, TimeUnit.MINUTES);
if (finshed) {
//Doing something
}

编辑:
不幸的是,obj1 - obj4 类正在使用 WebHarvest 抓取一些网页,该 WebHarvest 使用 jakarta HttpClient 读取网页,而 HttpClient(WebHarvest 本身)没有任何功能整个页面读取和/或抓取作业超时。
这是我的耗时任务,我想在超时后杀死 ExecutorService 线程来处理这个问题。

最佳答案

一般来说,没有可靠的方法可以让一个单独的线程退出。特别是,没有可靠的方法可以在任务超时后从任务外部中断和停止任务。你需要做的是让任务自己负责在时间用完后停止。根据他们的行为,您可以将此行为抽象为一个父类(super class),例如:

public abstract class TimeoutRunnable implements Runnable {
private final long timeLimitMillis;
private long startTimeMillis;

public TimeoutRunnable(long timeLimitMillis) {
this.timeLimitMillis = timeLimitMillis;
}

public final void run() {
startTimeMillis = System.currentTimeMillis();
while (System.currentTimeMillis() - startTimeMillis < timeLimitMillis) {
runIteration();
}
}

protected abstract void runIteration();
}

然后在您的子类中覆盖 runIteration() 并执行任务的单个“步骤”。

关于java - 为 java. util. ​​concurrent.ExecutorService 中的每个执行设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8757715/

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