如何使用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类正在使用使用雅加达HttpClient读取网页的WebHarvest来抓取一些网页,而HttpClient (以及WebHarvest本身)在整个页面读取和/或刮取工作中没有任何超时功能。
这是我的一项耗时的任务,为了处理这个问题,我考虑在超时后终止ExecutorService线程。
发布于 2012-01-06 12:31:25
一般来说,没有可靠的方法使单独的线程退出。特别是,在任务外部超时之后,没有可靠的方法来中断和停止任务。你需要做的是让任务本身负责在他们的时间用完后停止。根据它们所做的,您可以将这种行为抽象为一个超类,如下所示:
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()并执行任务的一个“步骤”。
发布于 2012-01-06 13:32:52
终止任务的唯一合理可靠的方法是在单独的进程中运行它,如果超时,则终止该进程。在不支持超时的库中使用任何其他方法最多也是容易出错的。
发布于 2012-01-06 13:47:59
从我的观点来看,我认为这类东西需要比普通Java标准类更健壮的基础,这就是为什么我建议使用任何调度器基础结构(Quartz或任何其他项目)来为您提供句柄(作业标识符)来终止耗时的任务。
你可能会有这样的事情:
主线程启动Quartz Scheduler,接收来自不同作业的订阅,上面写着: Job1、Job2和TimeCheckerJob
TimeCheckerJob将是一份永远的工作,通知任何新工作,并检查每个新工作的生存期.在这个工作中,您必须处理每个作业的开始时间,小心OS时钟,不要试图设置太严格的约束(纳秒是纯虚构的)。
我的2美分杰罗姆
https://stackoverflow.com/questions/8757715
复制相似问题