【发布时间】:2012-01-06 12:19:43
【问题描述】:
如何使用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 线程来处理这个问题。
【问题讨论】:
-
这应该回答你的问题:stackoverflow.com/questions/2758612/…
-
该解决方案取决于
Thread#interrupt()。根据任务正在做什么,这可能没有实际效果,因为中断机制仅适用于某些阻塞操作;它不是一般的Thread#stop替代品。见docs.oracle.com/javase/1.5.0/docs/guide/misc/… -
@Ramon:我在问题的最后添加了一些细节,请看一下。谢谢
-
在这种情况下,您可能想尝试使用
Thread#interrupt()的解决方案。否则,这取决于您正在使用的库的详细信息。也许您可以将下载所在的 OutputStream 替换为 OutputStream 子类,该子类在达到超时后调用write时会引发异常。
标签: java timeout executorservice