我对ExecutorService的javadoc#shutdown方法感到困惑。这些说法不矛盾吗?
启动有序关闭,其中执行以前提交的任务,但不接受新任务。此方法不会等待以前提交的任务完成执行。使用waitTersion执行此操作。
如果它能有序地关闭之前提交的任务,那么它怎么能等它们完成执行呢?
这意味着任务将一直运行到完成,但此方法将立即返回,而无需等待。
因此,要在不杀死任何任务的情况下干净地关闭执行程序,您需要执行以下操作:
executor.shutdown();
executor.awaitTermination(long timeout, TimeUnit unit);
或者,如果您只是想尽快停止执行器,请使用shutdownNow()
。
这意味着该方法在调用它的线程中立即返回,但尚未执行的任务可能仍在其他线程中运行。
如果您想让程序等待之前提交的任务完成,则必须在调用shutdown
后调用waittermination
。
我有以下代码
我从主线程调用了下面的代码,使用ExecutorService池并启动一个线程来处理找到的每个文件。我正在尝试了解当主线程被kill命令终止时ExecutorService的行为。生成的线程会发生什么?一旦完成工作,它们会立即被杀还是终止? 还有没有更好/更安全的方法来编写下面的代码段,特别是如果我在无限循环中运行这部分,例如等待文件被放到输入目录并分配线程来处理它们?在这种情况下,我应该创建一个
java.util.concurrent.ExecutorService接口是Executor接口的子接口,并添加了管理生命周期的功能,包括单个任务和执行程序本身。 ExecutorService方法 Sr.No. 方法和描述 1 boolean awaitTermination(long timeout, TimeUnit unit) 阻止所有任务在关闭请求之后完成执行,或发生超时,或者当前线程
问题内容: 在我的webapp中,我创建了一个使用固定大小的ThreadPool的服务。我在整个应用程序生命周期中都重复使用了相同的代码。 所有人都在Tomcat中运行,这在关闭时给我以下错误: 我确实意识到我需要在关闭tomcat之前先关闭ExecutorService。Soms SO线程已经在谈论这一点,但是我找不到一种干净的方法来解决这个问题。 是否应该在正常关闭线程和执行器的情况下使用建议
我有一个简单的java,它运行一些任务对象(实现)。 除了尽最大努力尝试停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过{@link thread#interrupt}取消,因此任何未能响应中断的任务都可能永远不会终止。 我的问题是,有没有办法确保那些(任务)线程会终止?我想出的最佳解决方案是在程序末尾调用,但这显然是愚蠢的。
由于我不关心响应,也不关心这些任务产生的任何异常,所以我选择使用ExecutorService而不是Callable或CompletableFuture。 然后,对于我在controller中接收到的传入请求,运行两个for循环,并将这些任务分配给ExecutorService: 我的问题是关于关闭ExecutorService。我知道优雅关机(shutdown)、混合关机(awaitTermin