首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java.​util.​concurrent.ExecutorService中为每个执行设置一个超时

在java.​util.​concurrent.ExecutorService中为每个执行设置一个超时
EN

Stack Overflow用户
提问于 2012-01-06 12:19:43
回答 3查看 1.7K关注 0票数 2

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

我的代码是这样的:

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

代码语言:javascript
复制
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线程。

EN

回答 3

Stack Overflow用户

发布于 2012-01-06 12:31:25

一般来说,没有可靠的方法使单独的线程退出。特别是,在任务外部超时之后,没有可靠的方法来中断和停止任务。你需要做的是让任务本身负责在他们的时间用完后停止。根据它们所做的,您可以将这种行为抽象为一个超类,如下所示:

代码语言:javascript
复制
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()并执行任务的一个“步骤”。

票数 3
EN

Stack Overflow用户

发布于 2012-01-06 13:32:52

终止任务的唯一合理可靠的方法是在单独的进程中运行它,如果超时,则终止该进程。在不支持超时的库中使用任何其他方法最多也是容易出错的。

票数 1
EN

Stack Overflow用户

发布于 2012-01-06 13:47:59

从我的观点来看,我认为这类东西需要比普通Java标准类更健壮的基础,这就是为什么我建议使用任何调度器基础结构(Quartz或任何其他项目)来为您提供句柄(作业标识符)来终止耗时的任务。

你可能会有这样的事情:

主线程启动Quartz Scheduler,接收来自不同作业的订阅,上面写着: Job1、Job2和TimeCheckerJob

TimeCheckerJob将是一份永远的工作,通知任何新工作,并检查每个新工作的生存期.在这个工作中,您必须处理每个作业的开始时间,小心OS时钟,不要试图设置太严格的约束(纳秒是纯虚构的)。

我的2美分杰罗姆

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8757715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档