线程池程序不会结束与shutdown有关

使用线程池时,在main完成之前没的调用shutdonw使得,java进程不会结束。线程池默认的线程不是“守护线程”,线程池的timeout 大于 0时,code数量的线程是不会终止的。所以,当所有任务完成后,java程序不会结束。
ExecutorService.shutdown()将使之前通过Executor.execute()提交的任务运行结束后关闭线程池。ExecutorService还提供了一个与ExecutorService.shutdown()对应的方法名为ExecutorService.shutdownNow()该方法试图将结束已经提交的任务并结束线程池。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在常见的线程池实现中,有几种方法可以判断线程池中的任务是否已经结束: 1. 使用`awaitTermination()`方法:可以调用线程池的`awaitTermination()`方法来等待线程池中的所有任务执行完毕。这个方法会阻塞当前线程,直到所有任务执行完毕或超时。你可以设置一个超时时间来避免无限等待。 ```java ExecutorService executor = Executors.newFixedThreadPool(10); // 执行任务... executor.shutdown(); // 关闭线程池 try { executor.awaitTermination(1, TimeUnit.MINUTES); // 等待任务执行完毕 } catch (InterruptedException e) { // 处理中断异常 } ``` 如果`awaitTermination()`方法返回`true`,则表示线程池中的所有任务已经执行完毕;如果返回`false`,则表示等待超时。 2. 使用`isTerminated()`方法:可以通过调用线程池的`isTerminated()`方法来判断线程池中的任务是否全部执行完毕。 ```java ExecutorService executor = Executors.newFixedThreadPool(10); // 执行任务... executor.shutdown(); // 关闭线程池 while (!executor.isTerminated()) { // 等待任务执行完毕 } ``` 当线程池中的所有任务执行完毕后,`isTerminated()`方法会返回`true`,此时可以继续执行后续操作。 无论使用哪种方法,都需要在提交任务后调用线程池的`shutdown()`方法来关闭线程池,以确保不再接受新的任务。然后通过以上方法等待任务执行完毕。注意处理可能的中断异常,以保证程序的正常执行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值