ExecutorService对象的shutdown()和shutdownNow()的区别

103 篇文章 18 订阅
38 篇文章 1 订阅
可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。shutdown() 方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的 ExecutorService 以允许回收其资源。 

下列方法分两个阶段关闭 ExecutorService。第一阶段调用 shutdown 拒绝传入任务,然后调用 shutdownNow(如有必要)取消所有遗留的任务: 

 void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // Disable new tasks from being submitted
   try {
     // Wait a while for existing tasks to terminate
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow(); // Cancel currently executing tasks
       // Wait a while for tasks to respond to being cancelled
       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
           System.err.println("Pool did not terminate");
     }
   } catch (InterruptedException ie) {
     // (Re-)Cancel if current thread also interrupted
     pool.shutdownNow();
     // Preserve interrupt status
     Thread.currentThread().interrupt();
   }
 }


shutdown调用后,不可以再submit新的task,已经submit的将继续执行。

shutdownNow试图停止当前正执行的task,并返回尚未执行的task的list

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
`java.util.concurrent.ThreadPoolExecutor`是Java中用于管理线程池的类。`shutdown()`和`shutdownNow()`都是用于关闭线程池的方法,但它们之间有一些区别。 - `shutdown()`方法:该方法将线程池状态设置为SHUTDOWN,不再接受新任务,但会等待所有已经提交的任务执行完成后再关闭线程池。如果在调用`shutdown()`方法后又提交了新任务,这些新任务将会被拒绝执行并抛出`RejectedExecutionException`异常。 - `shutdownNow()`方法:该方法将线程池状态设置为STOP,不再接受新任务,并尝试停止所有正在执行的任务,包括等待执行的任务。该方法会尝试中断正在执行的任务,如果任务无法被中断,则会保持运行状态。该方法返回一个`List<Runnable>`,其中包含所有等待执行的任务。 以下是一个示例代码,演示了如何使用`ThreadPoolExecutor`类以及如何使用`shutdown()`和`shutdownNow()`方法: ```java import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolExample { public static void main(String[] args) throws InterruptedException { // 创建一个线程池,最多同时执行2个任务 ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); // 提交5个任务 for (int i = 0; i < 5; i++) { executor.submit(new Task(i)); } // 关闭线程池 executor.shutdown(); // 等待所有任务执行完成 executor.awaitTermination(1, TimeUnit.MINUTES); // 输出线程池状态 System.out.println("线程池状态:" + (executor.isTerminated() ? "已关闭" : "未关闭")); // 再次提交任务,会抛出RejectedExecutionException异常 executor.submit(new Task(5)); // 关闭线程池 executor.shutdownNow(); // 输出线程池状态 System.out.println("线程池状态:" + (executor.isTerminated() ? "已关闭" : "未关闭")); } static class Task implements Runnable { private int taskId; public Task(int taskId) { this.taskId = taskId; } @Override public void run() { System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Task " + taskId + " is interrupted"); } System.out.println("Task " + taskId + " is completed"); } } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值