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

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

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

[java]  view plain copy
  1. void shutdownAndAwaitTermination(ExecutorService pool) {  
  2.   pool.shutdown(); // Disable new tasks from being submitted  
  3.   try {  
  4.     // Wait a while for existing tasks to terminate  
  5.     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {  
  6.       pool.shutdownNow(); // Cancel currently executing tasks  
  7.       // Wait a while for tasks to respond to being cancelled  
  8.       if (!pool.awaitTermination(60, TimeUnit.SECONDS))  
  9.           System.err.println("Pool did not terminate");  
  10.     }  
  11.   } catch (InterruptedException ie) {  
  12.     // (Re-)Cancel if current thread also interrupted  
  13.     pool.shutdownNow();  
  14.     // Preserve interrupt status  
  15.     Thread.currentThread().interrupt();  
  16.   }  
  17. }  
        shutdown调用后,不可以再submit新的task,已经submit的将继续执行。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`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"); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值