使用ScheduledExecutorService时shutdown后再次请求 报RejectedExecutionException
时间: 2023-10-27 15:49:57 浏览: 186
这个错误通常发生在你尝试提交任务到已经关闭的ScheduledExecutorService中。如果你在关闭ScheduledExecutorService后再次提交任务,就会收到RejectedExecutionException异常。
你可以重新创建一个新的ScheduledExecutorService来解决这个问题,或者在调用shutdown()方法之前等待所有的任务都完成。另外,你也可以使用awaitTermination()方法等待所有任务完成后再调用shutdown()方法。
相关问题
使用 ScheduledExecutorService 后关闭
ScheduledExecutorService 是 Java 提供的用于执行周期性任务的线程池。在使用 ScheduledExecutorService 时,如果不再需要执行任务,可以通过调用 shutdown() 方法来关闭 ScheduledExecutorService,该方法将会停止所有周期性任务的执行并且等待所有正在执行的任务执行完毕。
如果需要立即关闭 ScheduledExecutorService,可以调用 shutdownNow() 方法,该方法将会尝试停止所有正在执行的任务,并且不再等待周期性任务的完成。但是,该方法不能保证所有任务都能被停止,可能会有一部分任务继续执行。
如果需要确保 ScheduledExecutorService 中所有任务都已经停止并且线程池已经被关闭,可以在调用 shutdown() 或 shutdownNow() 方法之后调用 awaitTermination() 方法等待一段时间,直到线程池中所有任务都执行完毕或者等待时间超时。如果等待时间超时,可以通过调用 shutdownNow() 方法来强制停止所有任务并关闭线程池。
ScheduledExecutorService shutdown 和shutdownnow区别
ScheduledExecutorService 提供了两种关闭线程池的方法:shutdown 和 shutdownNow。
shutdown 方法会等待所有已提交的任务执行完成后才会关闭线程池。如果在 shutdown 被调用之前没有任何任务被提交,则线程池会立即关闭。
shutdownNow 方法会尝试立即停止所有正在执行的任务,并且跳过所有已提交但尚未执行的任务。此方法返回的是一个 List<Runnable>,其中包含了那些未执行的任务。
总之,shutdown 方法是一种温和的关闭线程池的方式,它会等待所有任务执行完成后再关闭线程池;而 shutdownNow 方法则是一种强制关闭线程池的方式,它会立即停止所有正在执行的任务,但不会等待已提交的任务执行完成。
阅读全文