【问题标题】:Ideal value for timeout in ExecutorServiceExecutorService 中超时的理想值
【发布时间】:2020-12-23 16:29:13
【问题描述】:

我想了解 executorservice 的 awaitTermination() 方法中超时的理想值。我们应该如何决定理想的超时时间?如果我们使用一天作为超时时间会不会有害?

boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;

假设我正在将数据从一个数据库加载到另一个数据库。有时它可能会因为网络问题而变慢,甚至上传的文件数量也可能会增加。所以判断最大时间变得有点困难。因此,在这种情况下,如果我使用一天作为超时(实际上,我想使用 awaitTermination() 而不会从 executorService 端超时)。这到底有什么缺点?

awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS) 的缺点是什么?

因为无论如何,一旦任务完成,executorservice 就会终止

【问题讨论】:

  • 如果您希望awaitTermination 没有超时,您可以随时求助于awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS)。超时时间过长的缺点通常是它可能会阻止您的应用程序正确关闭,具体取决于执行程序服务的配置方式以及其中的任务。我不相信对其他人来说存在“理想的超时值”之类的东西,只有您应该根据应用程序的其他方面了解这些东西。
  • 你为什么打电话给awaitTermination
  • 有更好的方法来达到这个目的,例如invokeAll。该方法有一个没有超时的版本。
  • invokeAll() 返回时,参数中传递的所有作业都已完成。当没有其他工作时,您不需要awaitTermination。事实上,即使有其他工作的完成状态与你无关,你仍然不需要awaitTermination
  • shutdown 是调用shutdown 时启动的进程。执行程序服务在该过程完成后终止。

标签: java multithreading executorservice


【解决方案1】:

这取决于任务可以消耗多长时间。

在最坏的情况下,最长的任务需要多长时间? 假设在最坏的情况下需要 1 分钟。然后花2分钟。 您只需计算最坏情况时间加上缓冲区。

您根本不会无缘无故取消已启动的作业,因为您可能会丢失数据。

如果您正在工作,例如在带有确认的队列上,并且您仅在工作完成后才确认,您可以立即终止,因为在下次启动时和超时后,您的工作人员会再次获得任务。 (但要小心。如果您重新启动服务器,您可能会陷入循环)

【讨论】:

  • 我正在尝试制作一个通用框架,它从 Cassandra 读取数据并将其放入 elasticsearch。所以表中的数据各不相同。所以我无法决定 executorService 的超时时间。
  • 你不能在 cassandra 中做类似分页的事情吗?也许你找到了一种方法来分割可见的切片。我不知道卡珊德拉。但也许您想添加标签“cassandra”或使用标签 cassandra 再次询问。我建议您寻找一种方法来获得可预见的时间。顺便提一句。为什么要中断进程?如果我会做这样的转移,那将是一个单一的动作。或者你试试同步之类的东西?您搜索过现有工具吗?也许其他人已经这样做了。
猜你喜欢
  • 1970-01-01
  • 2015-01-03
  • 2011-02-15
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
相关资源
最近更新 更多