【发布时间】: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