当前位置:   article > 正文

四种方法实现多线程按着指定顺序执行_spring多线程等待执行完毕后再执行

spring多线程等待执行完毕后再执行

文章介绍4种方法,简单易懂,通过4个demo抛砖引玉。

目录

  • 在子线程中通过join()方法指定顺序

  • 在主线程中通过join()方法指定顺序

  • 通过倒数计时器CountDownLatch实现

  • 通过创建单一化线程池newSingleThreadExecutor()实现

在子线程中通过join()方法指定顺序

通过join()方法使当前线程“阻塞”,等待指定线程执行完毕后继续执行。

举例:在线程thread2中,加上一句thread1.join(),其意义在于,当前线程2运行到此行代码时会进入阻塞状态,直到线程thread1执行完毕后,线程thread2才会继续运行,这就保证了线程thread1与线程thread2的运行顺序。

  1. public class ThreadJoinDemo {
  2.     public static void main(String[] args) throws InterruptedException {
  3.         final Thread thread1 = new Thread(new Runnable() {
  4.             @Override
  5.             public void run() {
  6.                 System.out.println("打开冰箱!");
  7.             }
  8.         });
  9.  
  10.         final Thread thread2 = new Thread(new Runnable() {
  11.             @Override
  12.             public void run() {
  13.                 try {
  14.                     thread1.join();
  15.                 } catch (InterruptedException e) {
  16.                     e.printStackTrace();
  17.                 }
  18.                 System.out.println("拿出一瓶牛奶!");
  19.             }
  20.         });
  21.  
  22.         final Thread thread3 = new Thread(new Runnable() {
  23.             @Override
  24.             public void run() {
  25.                 try {
  26.                     thread2.join();
  27.                 } catch (InterruptedException e) {
  28.                     e.printStackTrace();
  29.                 }
  30.                 System.out.println("关上冰箱!");
  31.             }
  32.         });
  33.  
  34.         //下面三行代码顺序可随意调整,程序运行结果不受影响,因为我们在子线程中通过“join()方法”已经指定了运行顺序。
  35.         thread3.start();
  36.         thread2.start();
  37.         thread1.start();
  38.  
  39.     }
  40. }

运行结果:

  1. 打开冰箱!
  2. 拿出一瓶牛奶!
  3. 关上冰箱!

在主线程中通过join()方法指定顺序

简单说一下子线程与主线程的区别,子线程指的是发生在Thread内部的代码,主线程指的是发生在main函数中的代码,我们可以在main函数中通过join()方法让主线程阻塞等待以达到指定顺序执行的目的。如果您正在学习Spring Boot,那么推荐一个连载多年还在继续更新的免费教程:Spring Boot 2.x基础教程 | 程序猿DD

  1. public class ThreadMainJoinDemo {
  2.     public static void main(String[] args) throws InterruptedException {
  3.         final Thread thread1 = new Thread(new Runnable() {
  4.             @Override
  5.             public void run() {
  6.                 System.out.println("打开冰箱!");
  7.             }
  8.         });
  9.  
  10.         final Thread thread2 = new Thread(new Runnable() {
  11.             @Override
  12.             public void run() {
  13.                 System.out.println("拿出一瓶牛奶!");
  14.             }
  15.         });
  16.  
  17.         final Thread thread3 = new Thread(new Runnable() {
  18.             @Override
  19.             public void run() {
  20.                 System.out.println("关上冰箱!");
  21.             }
  22.         });
  23.  
  24.         thread1.start();
  25.         thread1.join();
  26.         thread2.start();
  27.         thread2.join();
  28.         thread3.start();
  29.     }
  30. }

输出结果:

  1. 打开冰箱!
  2. 拿出一瓶牛奶!
  3. 关上冰箱!

通过倒数计时器CountDownLatch实现

CountDownLatch通过计数器提供了更灵活的控制,只要检测到计数器为0当前线程就可以往下执行而不用管相应的thread是否执行完毕。

  1. public class ThreadCountDownLatchDemo {
  2.   // Java前沿专栏:https://www.didispace.com/java-features/
  3.     private static CountDownLatch countDownLatch1 = new CountDownLatch(1);
  4.   private static CountDownLatch countDownLatch2 = new CountDownLatch(1);
  5.  
  6.     public static void main(String[] args) {
  7.         final Thread thread1 = new Thread(new Runnable() {
  8.             @Override
  9.             public void run() {
  10.                 System.out.println("打开冰箱!");
  11.                 countDownLatch1.countDown();
  12.             }
  13.         });
  14.  
  15.         final Thread thread2 = new Thread(new Runnable() {
  16.             @Override
  17.             public void run() {
  18.                 try {
  19.                     countDownLatch1.await();
  20.                     System.out.println("拿出一瓶牛奶!");
  21.                     countDownLatch2.countDown();
  22.                 } catch (InterruptedException e) {
  23.                     e.printStackTrace();
  24.                 }
  25.             }
  26.         });
  27.  
  28.         final Thread thread3 = new Thread(new Runnable() {
  29.             @Override
  30.             public void run() {
  31.                 try {
  32.                     countDownLatch2.await();
  33.                     System.out.println("关上冰箱!");
  34.                 } catch (InterruptedException e) {
  35.                     e.printStackTrace();
  36.                 }
  37.             }
  38.         });
  39.  
  40.         //下面三行代码顺序可随意调整,程序运行结果不受影响
  41.         thread3.start();
  42.         thread1.start();
  43.         thread2.start();
  44.     }
  45. }

输出结果:

  1. 打开冰箱!
  2. 拿出一瓶牛奶!
  3. 关上冰箱!

通过创建单一化线程池newSingleThreadExecutor()实现

单线程化线程池(newSingleThreadExecutor)的优点,串行执行所有任务。

  1. public class ThreadPoolDemo {
  2.   // Spring Boot免费教程:https://blog.didispace.com/spring-boot-learning-2x/
  3.    static ExecutorService executorService = Executors.newSingleThreadExecutor();
  4.  
  5.     public static void main(String[] args) {
  6.         final Thread thread1 = new Thread(new Runnable() {
  7.             @Override
  8.             public void run() {
  9.                 System.out.println("打开冰箱!");
  10.             }
  11.         });
  12.  
  13.         final Thread thread2 =new Thread(new Runnable() {
  14.             @Override
  15.             public void run() {
  16.                 System.out.println("拿出一瓶牛奶!");
  17.             }
  18.         });
  19.  
  20.         final Thread thread3 = new Thread(new Runnable() {
  21.             @Override
  22.             public void run() {
  23.                 System.out.println("关上冰箱!");
  24.             }
  25.         });
  26.         executorService.submit(thread1);
  27.         executorService.submit(thread2);
  28.         executorService.submit(thread3);
  29.         executorService.shutdown();        //使用完毕记得关闭线程池
  30.     }
  31.  
  32. }

输出结果:

  1. 打开冰箱!
  2. 拿出一瓶牛奶!
  3. 关上冰箱!

来源:blog.csdn.net/jqc874789596/article/details/100557300

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取

推荐阅读

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/197820
推荐阅读
相关标签
  

闽ICP备14008679号