当前位置:   article > 正文

有三个线程T1,T2,T3,如何它们保证顺序执行?_有三个线程t1,t2,t3,怎么确保它们按顺序执行?

有三个线程t1,t2,t3,怎么确保它们按顺序执行?

目录

一、使用join方法

二、使用CountDownLatch(闭锁):

三、使用单个线程池:


一、使用join方法

        使用 join() 方法可以保证线程的顺序执行。在 Java 中,join() 方法是用来等待一个线程执行完成的方法,当调用某个线程的 join() 方法时,当前线程会被阻塞,直到该线程执行完成后才会继续执行。

具体来说,我们可以在 T1 线程结束时调用 T2 的 join() 方法,这样 T2 就会等待 T1 执行完成后再开始执行;同理,在 T2 结束时调用 T3 的 join() 方法,以确保 T3 在 T2 执行完成后才开始执行。这样就可以保证 T1、T2、T3 按照顺序依次执行。

  1. public class ThreadJoinDemo {
  2. public static void main(String[] args) throws InterruptedException {
  3. Thread t1 = new Thread(() -> System.out.println("t1"));
  4. Thread t2 = new Thread(() -> System.out.println("t2"));
  5. Thread t3 = new Thread(() -> System.out.println("t3"));
  6. t1.start();
  7. t1.join(); // 等待 t1 执行完成
  8. t2.start();
  9. t2.join(); // 等待 t2 执行完成
  10. t3.start();
  11. t3.join(); // 等待 t3 执行完成
  12. }
  13. }

二、使用CountDownLatch闭锁):

        使用 CountDownLatch(闭锁)方法可以保证线程的顺序执行。CountDownLatch 是一个同步工具类,它可以让某个线程等待多个线程完成各自的工作之后再继续执行。具体来说,我们可以使用两个 CountDownLatch 对象 latch1latch2 分别控制 T1、T2、T3 线程的执行顺序。

初始时,latch1 的计数器为1,latch2 的计数器为2。当 T1 执行完毕时,调用 latch1.countDown() 方法通知 T2 可以开始执行;当 T2 执行完毕时,调用 latch2.countDown() 方法通知 T3 可以开始执行。这样就可以确保 T1、T2、T3 按照顺序依次执行。

在 main 方法中,我们分别启动 T1、T2、T3 线程,然后等待它们执行完毕。需要注意的是,在使用 CountDownLatch 方法时,需要确保计数器的值正确设置,并且每个线程都能够独立执行完成,并且不会相互影响,以避免出现死锁等问题。

        

  1. import java.util.concurrent.CountDownLatch;
  2. public class ThreadCountDownLatchDemo {
  3. public static void main(String[] args) throws InterruptedException {
  4. CountDownLatch latch1 = new CountDownLatch(1);
  5. CountDownLatch latch2 = new CountDownLatch(2);
  6. Thread t1 = new Thread(() -> {
  7. System.out.println("t1");
  8. latch1.countDown();
  9. });
  10. Thread t2 = new Thread(() -> {
  11. try {
  12. latch1.await(); // 等待 t1 执行完成
  13. System.out.println("t2");
  14. latch2.countDown();
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. });
  19. Thread t3 = new Thread(() -> {
  20. try {
  21. latch2.await( ); // 等待 t2 执行完成
  22. System.out.println("t3");
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. }
  26. });
  27. t1.start();
  28. t2.start();
  29. t3.start();
  30. t1.join();
  31. t2.join();
  32. t3.join();
  33. }
  34. }

三、使用单个线程池

        使用单个线程池可以保证t1、t2、t3顺序执行,因为单个线程池只有一个工作线程每次只会执行一个任务。我们可以将t1、t2、t3三个任务按照顺序提交给单个线程池,这样就可以确保它们按照顺序依次执行。

        注意的是,在使用线程池时,需要确保每个任务都能够独立执行完成,并且不会相互影响,以避免出现线程安全等问题。

  1. import java.util.concurrent.ExecutorService;
  2. import java.util.concurrent.Executors;
  3. public class ThreadOrderDemo {
  4. private static ExecutorService executorService = Executors.newSingleThreadExecutor();
  5. public void t1() {
  6. System.out.println("t1");
  7. }
  8. public void t2() {
  9. System.out.println("t2");
  10. }
  11. public void t3() {
  12. System.out.println("t3");
  13. }
  14. public static void main(String[] args) {
  15. ThreadOrderDemo demo = new ThreadOrderDemo();
  16. executorService.submit(demo::t1);
  17. executorService.submit(demo::t2);
  18. executorService.submit(demo::t3);
  19. executorService.shutdown();
  20. }
  21. }

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

闽ICP备14008679号