• 多线程顺序运行有几种方法?


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

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

    通过join()方法使当前线程“阻塞”,

    运行结果:

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

    子线程指的是发生在Thread内部的代码,主线程指的是发生在main函数中的代码。最新多线程面试题整理好了,点击Java面试库小程序在线刷题。

    我们可以在main函数中通过join()方法让主线程阻塞等待以达到指定顺序执行的目的。

    public class ThreadMainJoinDemo {
        public static void main(String[] args) throws InterruptedException {
            final Thread thread1 = new Thread(new  Runnable() {
                @Override
                public void  run() {
                    System.out.println( "打开冰箱!");
                }
            });
     
            final Thread thread2 = new Thread(new  Runnable() {
                @Override
                public void  run() {
                    System.out.println( "拿出一瓶牛奶!");
                }
            });
     
            final Thread thread3 = new Thread(new  Runnable() {
                @Override
                public void  run() {
                    System.out.println( "关上冰箱!");
                }
            });
     
            thread1.start();
            thread1.join();
            thread2.start();
            thread2.join();
            thread3.start();
        }
    }

    基础就不介绍了,多线程系列我博客教程写了很多了,这里推荐大家看看吧:https://www.javastack.cn/categories/Java/

    输出结果:

    打开冰箱!
    拿出一瓶牛奶!
    关上冰箱!

    3、通过倒数计时器CountDownLatch实现

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

    public class ThreadCountDownLatchDemo {
     
        private static CountDownLatch countDownLatch1 = new CountDownLatch(1);
     
        private static CountDownLatch countDownLatch2 = new CountDownLatch(1);
     
        public static void main(String[] args) {
            final Thread thread1 = new Thread(new  Runnable() {
                @Override
                public void  run() {
                    System.out.println( "打开冰箱!");
                    countDownLatch1.countDown();
                }
            });
     
            final Thread thread2 = new Thread(new  Runnable() {
                @Override
                public void  run() {
                    try {
                        countDownLatch1.await();
                        System.out.println( "拿出一瓶牛奶!");
                        countDownLatch2.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
     
            final Thread thread3 = new Thread(new  Runnable() {
                @Override
                public void  run() {
                    try {
                        countDownLatch2.await();
                        System.out.println( "关上冰箱!");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
     
            //下面三行代码顺序可随意调整,程序运行结果不受影响
            thread3.start();
            thread1.start();
            thread2.start();
        }
    }
    打开冰箱!
    拿出一瓶牛奶!
    关上冰箱!

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

    输出结果:

    打开冰箱!
    拿出一瓶牛奶!
    关上冰箱!
  • 相关阅读:
    跨机器检查基于DCLI命令
    Verilog:【7】超详细WaveDrom教程,时序图绘制利器,看这一篇就够了。
    强大的JTAG边界扫描(1):基本原理介绍
    CSAPP 之 CacheLab 详解
    优化算法 -小批量随机梯度下降
    netrw模拟nerdtree的go命令连续打开多个文件
    WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题
    从方法到目标了解什么是机器学习?
    好像知道的人不多?Spring容器关闭执行销毁方法有几种,看完MQ源码我才知道SmartLifecycle最快
    K8S:kubeadm搭建K8S+Harbor 私有仓库
  • 原文地址:https://blog.csdn.net/jjc4261/article/details/126031695