java 超过时间则不等待_关于Java:如何在超时时间内等待ThreadPoolExecutor中的所有任务完成而又不关闭Executor的情况?...

使用ThreadPoolExecutor管理我的任务之后,而不是为每个任务创建单独的线程。 我使用以下部分来等待特定数量的任务完成:

poolThreadsExecutor.shutdown();

poolThreadsExecutor.awaitTermination(10, TimeUnit.MINUTES);

for (Future> future : futures) {

if (!future.isDone()) {

future.cancel(true);

}

}

使用此代码,我确保在运行任务完成之前,无法提交新任务。 正在运行的任务也有超时,然后我检查期货列表并取消所有任务以防万一。

使用此解决方案,我可以拥有所有要点,但问题是执行器之后将被销毁,并且每次都必须创建一个新执行器。

是否有可能在不关闭执行程序的情况下获得相同的功能?

附注:我也无法使用CoundDownLatch,因为之前不知道任务的数量。

这将是解决方案的概述:

计算完成任务的截止日期:deadline = currentTimeMillis() + timeout;

遍历所有期货,每次调整timeLeft = deadline - currentTimeMillis()时调用future.get(timeLeft, MILLISECONDS);

如果达到了最后期限,则跳出此循环并进入取消循环。

final long deadline = System.currentTimeMillis() + timeout;

for (Future< ? > f : futures) {

final long timeLeft = deadline - System.currentTimeMillis();

if (timeLeft <= 0) break;

try {

f.get(timeLeft, TimeUnit.MILLISECONDS);

} catch (TimeoutException e) {

break;

}

}

for (Future< ? > f : futures) {

if (!future.isDone()) {

future.cancel(true);

}

}

我修改了代码以满足我的需求。所以现在看起来像:for (Future< ? > f : futures) { try { f.get(timeout, TimeUnit.SECONDS); } catch (Exception e) { logger.warn("Error occured ...:" + e.getLocalizedMessage()); } } for (Future< ? > f : futures) { if (!future.isDone()) { future.cancel(true); } }

所以您从catch块中遗漏了break;吗?没有它就可以工作,但我不会遗漏它。

首先,我写了continue;,但是因为之后没有写任何代码,所以没有必要。为了获得其他任务的结果,我省略了break;。现在,每个任务都将变成一个"较小"的超时,在该超时中,它应该完成计算,并且如果一个任务被阻塞或引发另一个异常,则将写入日志消息,并且我尝试从下一个任务获取结果。最后,如果有的话,我取消所有被阻止的任务。

我知道,即使在超时后,您也想记录所有异常。

现在,我想通过提供一个池名来解决另一个小问题。是否可以在不使用其他库(例如com.google.common.util.concurrent.ThreadFactoryBuilder)的情况下设置池名?

我不知道您如何提交任务。 但我看到您有一份期货清单。

如果您可以一次提交所有任务,则可以使用:

futures = poolThreadsExecutor.invokeAll(tasks, 10, TimeUnit.MINUTES);

它将执行您的任务,直到所有已完成或超时到期(尚未完成的任务都被取消)为止。

另外,来自番石榴的Futures.successfulAsList可能会有所帮助。

我认为操作人员注意到,事先不知道期货的数量排除了这一点。

正如Marko所说。任务数量之前未知。创建一个后,我将使用以下函数提交该文件:poolThreadsExecutor.submit(task),然后将返回值保存在稍后处理的列表中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值