Java怎么让多线程按顺序执行
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本文小编为大家详细介绍"Java怎么让多线程按顺序执行",内容详细,步骤清晰,细节处理妥当,希望这篇"Java怎么让多线程按顺序执行"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
千家信息网最后更新 2025年11月08日Java怎么让多线程按顺序执行
本文小编为大家详细介绍"Java怎么让多线程按顺序执行",内容详细,步骤清晰,细节处理妥当,希望这篇"Java怎么让多线程按顺序执行"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
在子线程中通过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(); }}运行结果:
打开冰箱!
拿出一瓶牛奶!
关上冰箱!
在主线程中通过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(); }}输出结果:
打开冰箱!
拿出一瓶牛奶!
关上冰箱!
通过倒数计时器CountDownLatch实现
CountDownLatch通过计数器提供了更灵活的控制,只要检测到计数器为0当前线程就可以往下执行而不用管相应的thread是否执行完毕。
public class ThreadCountDownLatchDemo { private static CountDownLatch countDownLatch2 = new CountDownLatch(1); private static CountDownLatch countDownLatch3 = new CountDownLatch(1); public static void main(String[] args) { final Thread thread1 = new Thread(new Runnable() { @Override public void run() { System.out.println("打开冰箱!"); countDownLatch2.countDown(); } }); final Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { countDownLatch2.await(); System.out.println("拿出一瓶牛奶!"); countDownLatch3.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } }); final Thread thread3 = new Thread(new Runnable() { @Override public void run() { try { countDownLatch3.await(); System.out.println("关上冰箱!"); } catch (InterruptedException e) { e.printStackTrace(); } } }); //下面三行代码顺序可随意调整,程序运行结果不受影响 thread3.start(); thread1.start(); thread2.start(); }}输出结果:
打开冰箱!
拿出一瓶牛奶!
关上冰箱!
通过创建单一化线程池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(); //使用完毕记得关闭线程池 } }输出结果:
打开冰箱!
拿出一瓶牛奶!
关上冰箱!
读到这里,这篇"Java怎么让多线程按顺序执行"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
线程
冰箱
顺序
牛奶
运行
结果
代码
方法
中通
文章
输出
阻塞
内容
函数
程序
计数器
三行
影响
调整
妥当
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
mysql设置数据库默认用户
火影忍者删除服务器
江北区立体化刀片服务器售后服务
网页和数据库如何结合
关于会员网络技术有限公司
存储服务器磁盘丢失
我市举行网络安全宣传周启动
东海智能网络技术品质保障
177 归属地 数据库
服务器怎么导入游戏
网络安全服务如何扩充客户量
网络安全中什么是人为因素
电子商务数据库技术考试广药
数据库employee表练习
excel里怎么分离数据库
数据库窗体按钮的前景色
计算机网络技术原理及应用
软件开发需要哪些手续
上海数据库空投箱生产厂家
服务器nacos自动关闭
蓝盾网络安全有哪些产品
中原科技学院网络技术中心
智联物联打印服务器网络瘫痪
在ncbi上怎么下载数据库
怀旧服服务器法师升级攻略
显示数据库的语法格式是
戴尔r720是什么服务器
wifi选多少dns服务器ip
哪儿有网络安全接入控制
HMI软件开发内容