当前位置: 首页 > 知识库问答 >
问题:

ExecutorService中的awaitTermination是否在它之后执行的任何代码“发生-之前”?

童琪
2023-03-14

请帮助理解ExecutorService#AwaitTermination(timeout)行为。

当我的代码中有:

private void shutdownAndAwaitTermination(ExecutorService threadPool){
    threadPool.shutdown(); 
    try {
        if (!threadPool.awaitTermination(threadPoolTimeout, TimeUnit.HOURS)){
            threadPool.shutdownNow(); 
            if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {
                logger.warn("Pool did not terminate");
            }
        }
    }
    catch (InterruptedException ie)     {
        threadPool.shutdownNow();
        Thread.currentThread().interrupt();
    }
}

在本例中,pool中的任务是否在同一线程中shutdownAndAwaitTermination()之后的任何其他调用之前完成?

看看在生产过程中发生的事情,我相信答案是否定的,但我只想了解如何确保在调用shutdownAndAwaitTermination()后放置的任何代码将在池中的最后一个任务完成后发生。

多谢了。

共有1个答案

陈誉
2023-03-14

不,任务肯定可以在您从ShutdownAndAwaitTermination()方法返回后完成,因为您实际上并不等待终止。如果等待的线程中断,或者它花费的时间太长,您就会停止等待,即使任务可能仍在运行。

即使调用ShutdownNow(),您的任务也可能不会响应中断(通常,ExecutorService不能保证使用中断)。因此任务可能仍在运行。

如果您希望确保任务完成--在从该方法返回之前,您必须一直尝试,直到awaittermination()返回true为止,尽管有中断等。这将是一个糟糕的设计,因此如果您的任务通过future返回结果,而不是非原子地产生副作用,会更好。这样,可以对成功完成的任务采取行动,而可以忽略未完成的任务。

 类似资料:
  • 问题内容: ExpressJS中间件,,有像钩子和。 但是我正在寻找和方法的挂钩。 问题答案: 和中间件可用于“ 之前 ”,而and 事件的组合可用于“ 之后” 。 中间件就是一个例子,默认情况下,它将在响应后追加到日志中。 只需确保先使用此“ 中间件 ”即可,因为顺序很重要。

  • 有父子两个组件 父子都有一个数组 父组件的数组list更新, 子组件的数组tableData会跟着更新,并显示在表格上. 现在有个新增的按钮, 要求在新增时 先更新一下表格 再插入新的一行. 但是更新表格是在父组件请求,子组件通过useEffect跟着更新,导致新增时插入的一行被覆盖了(useEffect更新的逻辑比插入逻辑晚导致被覆盖),要怎么处理. 一个办法是把新增一行的逻辑移到useEffe

  • 我正在尝试用Java编写一个进程,该进程并发执行一系列任务,等待任务完成,然后将整个进程标记为完成。每个任务都有自己的信息,包括单个任务何时完成。我将使用ExecutorService作为流程,并将流程的本质归纳如下: 每个MyRunnable对象都有一个run方法,该方法进行webservice调用,然后将调用的结果写入数据库,包括调用完成的时间。ComplethisProcess方法只是将整个

  • 问题内容: 我想知道以下代码的行为背后的机制是什么: 我的理解是不 返回 函数,而是 关闭连接/结束请求 。这可以解释为什么我仍然可以在命令后执行代码(我查看了快速源,但它似乎不是异步函数)。 还有其他我可能会想念的东西吗? 问题答案: 当然可以结束HTTP响应,但是它对您的代码没有做任何特殊的事情。 即使您已结束回复,也可以继续做其他事情。 但是,您 无法 做的是利用进行任何有用的操作。由于响应

  • 然而,这并不起作用,应用程序运行并不拾取这个挂载的属性文件,它使用的是封装在jar中的默认属性文件。但是当我进入已启动的容器并再次手动运行entrypoint cmd时,它通过拾取我挂载的文件而按预期工作。所以我想知道这是不是与mount如何使用entrypoint相关?或者我只是没有为这个案例正确地编写Dockerfile?

  • 问题内容: 我正在编写一个swing应用,当执行某些方法时,我希望有“ wait”光标。我们可以这样: 我想要实现的是一个Java批注,该批注将在方法执行之前设置等待游标,并在执行后将其设置回正常状态。所以前面的例子看起来像这样 我怎样才能做到这一点?也欢迎提出有关解决此问题的其他方法的建议。谢谢! PS-我们在项目中使用Google Guice,但我不知道如何使用它来解决问题。如果有人为我提供类