当前位置:首页 > 科技  > 软件

掌握这四种方法,多线程按序执行不再是问题

来源: 责编: 时间:2024-06-27 17:20:27 73观看
导读目录在子线程中通过join()方法指定顺序在主线程中通过join()方法指定顺序通过倒数计时器CountDownLatch实现通过创建单一化线程池newSingleThreadExecutor()实现在子线程中通过join()方法指定顺序通过join()方法使当

目录

  • 在子线程中通过join()方法指定顺序
  • 在主线程中通过join()方法指定顺序
  • 通过倒数计时器CountDownLatch实现
  • 通过创建单一化线程池newSingleThreadExecutor()实现

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

通过join()方法使当前线程“阻塞”,等待指定线程执行完毕后继续执行。QOO28资讯网——每日最新资讯28at.com

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

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

运行结果:QOO28资讯网——每日最新资讯28at.com

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

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

简单说一下子线程与主线程的区别,子线程指的是发生在Thread内部的代码,主线程指的是发生在main函数中的代码,我们可以在main函数中通过join()方法让主线程阻塞等待以达到指定顺序执行的目的。QOO28资讯网——每日最新资讯28at.com

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

输出结果:QOO28资讯网——每日最新资讯28at.com

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

通过倒数计时器CountDownLatch实现

CountDownLatch通过计数器提供了更灵活的控制,只要检测到计数器为0当前线程就可以往下执行而不用管相应的thread是否执行完毕。QOO28资讯网——每日最新资讯28at.com

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

输出结果:QOO28资讯网——每日最新资讯28at.com

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

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

单线程化线程池(newSingleThreadExecutor)的优点,串行执行所有任务。QOO28资讯网——每日最新资讯28at.com

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();        //使用完毕记得关闭线程池    }}

输出结果:QOO28资讯网——每日最新资讯28at.com

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

QOO28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-96998-0.html掌握这四种方法,多线程按序执行不再是问题

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Library Cache Hash Bucket与共享池闩锁争用问题

下一篇: Python自动化:适合新手练习的五个有趣又实用的Python脚本,帮你快速掌握编程技能!拿走不谢!

标签:
  • 热门焦点
Top
Baidu
map