栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章介绍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)的优点,串行执行所有任务。

输出结果:

打开冰箱!
拿出一瓶牛奶!
关上冰箱!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032243.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号