关于java:多线程顺序运行的-4-种方法面试随便问

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

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

通过join()办法使以后线程“阻塞”,期待指定线程执行结束后继续执行。

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

public class ThreadJoinDemo {
    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() {
                try {
                    thread1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("拿出一瓶牛奶!");
            }
        });
 
        final Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    thread2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("关上冰箱!");
            }
        });
 
        //上面三行代码程序可随便调整,程序运行后果不受影响,因为咱们在子线程中通过“join()办法”曾经指定了运行程序。
        thread3.start();
        thread2.start();
        thread1.start();
 
    }
}

运行后果:

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

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

简略说一下子线程与主线程的区别,子线程指的是产生在Thread外部的代码,主线程指的是产生在main函数中的代码,咱们能够在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/cate…

输入后果:

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

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();
    }
}

输入后果:

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

4、通过创立单一化线程池newSingleThreadExecutor()实现

单线程化线程池(newSingleThreadExecutor)的长处,串行执行所有工作。

public class ThreadPoolDemo {
 
   static ExecutorService executorService = Executors.newSingleThreadExecutor();
 
    public static void main(String[] args) {
        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("关上冰箱!");
            }
        });
        executorService.submit(thread1);
        executorService.submit(thread2);
        executorService.submit(thread3);
        executorService.shutdown();        //应用结束记得敞开线程池
    }
 
}

输入后果:

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

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

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理