线程池中shutdown,awaitTermination,shutdownNow的作用和区别

本文通过具体示例,深入探讨了Java线程池的使用方法与锁对象的同步机制,展示了如何利用线程池提高并发效率,并分析了shutdown与awaitTermination方法在控制线程生命周期中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2018-09-28 18:46:04 faker____ 阅读数 832更多

分类专栏: java

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/faker____/article/details/82888392

 
  1. package ThreadPools_5;

  2.  
  3. import java.util.ArrayList;

  4. import java.util.List;

  5. import java.util.Random;

  6. import java.util.concurrent.ExecutorService;

  7. import java.util.concurrent.Executors;

  8. import java.util.concurrent.TimeUnit;

  9.  
  10. /**

  11. * This is the implementation of {@link LockObjects_4.Worker} with threadPool

  12. * <br><br>

  13. * Codes with minor comments are from

  14. * <a href="http://www.caveofprogramming.com/youtube/">

  15. * <em>http://www.caveofprogramming.com/youtube/</em>

  16. * </a>

  17. * <br>

  18. * also freely available at

  19. * <a href="https://www.udemy.com/java-multithreading/?couponCode=FREE">

  20. * <em>https://www.udemy.com/java-multithreading/?couponCode=FREE</em>

  21. * </a>

  22. *

  23. * @author Z.B. Celik <celik.berkay@gmail.com>

  24. */

  25. class Worker implements Runnable {

  26.  
  27. private Random random = new Random();

  28. private final Object lock1 = new Object();

  29. private final Object lock2 = new Object();

  30. public List<Integer> list1 = new ArrayList<Integer>();

  31. public List<Integer> list2 = new ArrayList<Integer>();

  32.  
  33. public void run() {

  34. process();

  35. }

  36.  
  37. public void process() {

  38. for (int i = 0; i < 1000; i++) {

  39. stageOne();

  40. stageTwo();

  41. }

  42. }

  43.  
  44. public void stageOne() {

  45. synchronized (lock1) {

  46. try {

  47. Thread.sleep(1);

  48. } catch (InterruptedException e) {

  49. //do your work here

  50. e.printStackTrace();

  51. }

  52. list1.add(random.nextInt(100));

  53. }

  54. }

  55.  
  56. public void stageTwo() {

  57. synchronized (lock2) {

  58. try {

  59. Thread.sleep(1);

  60. } catch (InterruptedException e) {

  61. //do your work here

  62. e.printStackTrace();

  63. }

  64. list2.add(random.nextInt(100));

  65. }

  66. }

  67. }

  68.  
  69. public class WorkerThreadPool {

  70.  
  71. public static void main(String[] args) {

  72. ExecutorService executor = Executors.newFixedThreadPool(2);//two threads, try setting by 1 to observe time

  73. System.out.println("Starting ...");

  74. long start = System.currentTimeMillis();

  75. Worker worker = new Worker();

  76. for (int i = 0; i < 2; i++) {//worker.run is called 2 (threads started) times by two threads

  77. executor.submit(worker);

  78. }

  79. executor.shutdown(); //prevents new tasks from being accepted by the ExecutorService

  80. try {

  81. executor.awaitTermination(1, TimeUnit.DAYS);

  82. // How long should I wait for termination If I do not know exactly when threads are done with the tasks ?

  83. // Source:http://stackoverflow.com/questions/1250643/how-to-wait-for-all-threads-to-finish-using-executorservice

  84. // For a perpetually running batch kind of thing u need to submit jobs and wait for them to

  85. // finish before jumping ahead.

  86. // In Such a case a latch or a barrier makes more sense than a shutdown (see CountDownLatch_6.App).

  87. } catch (Exception ex) {

  88. System.out.println(ex.getMessage());

  89. }

  90. long end = System.currentTimeMillis();

  91. System.out.println("Time taken: " + (end - start));

  92. System.out.println("List1: " + worker.list1.size() + "; List2: " + worker.list2.size());

  93. }

  94.  
  95. }

 

 上述代码执行后控制台打印

Starting ...
Time taken: 2183
List1: 2000; List2: 2000
 

  1. shutdown方法:平滑的关闭ExecutorService,当此方法被调用时,ExecutorService停止接收新的任务并且等待已经提交的任务(包含提交正在执行和提交未执行)执行完成。当所有提交任务执行完毕,线程池即被关闭。

  2. awaitTermination方法:接收人timeout和TimeUnit两个参数,用于设定超时时间及单位。当等待超过设定时间时,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。

   3.shutdownNow方法的作用是向所有执行中的线程发出interrupted以中止线程的运行。这时,各个线程会抛出               InterruptedException异常(前提是
线程中运行了sleep等会抛出异常的方法)

在上述代码中 shutdown方法的意思是等待当前正在执行的线程执行完毕 并且停止接受新的线程执行,如果新开线程的话会抛出RejectedExecutionException异常

awaitTermination的第一个参数是时间,第二个参数是时间单位,在这个地方监视线程是否都执行完毕,如果执行完毕后会执行后面的代码

 

一般情况下awaitTermination和shutdown配合使用,在上述代码中如果注释掉shutdown方法则awaitTermination不会监视到线程池关闭的信息 所以在这个地方代码会堵塞,

如果注释掉awaitTermination方法 则后面的代码不会得到线程执行过的结果

控制台结果

Starting ...
Time taken: 2
List1: 0; List2: 0

 

参考资料 点这里

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值