Java怎么让多线程按顺序执行
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,本文小编为大家详细介绍"Java怎么让多线程按顺序执行",内容详细,步骤清晰,细节处理妥当,希望这篇"Java怎么让多线程按顺序执行"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
千家信息网最后更新 2025年01月18日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安全错误
数据库的锁怎样保障安全
sql数据库断开连接
盈克网络技术推广
EDI是网络安全技术吗
链环科技怎么转型互联网
河北大者网络技术有限公司地址
服务器设置一直重启
pc端直播软件开发需要用到c吗
计算机网络技术和云计算那个好
网络安全专利有什么
技术开发数据库管理软件
我国发网络安全技术
osg数据库
小程序客户端调用数据库
网络安全审查办法自哪年起实施
fc-san服务器架构
电脑服务器自动生产线哪家不错
闵行区多功能软件开发费用
服务器实例
软件开发功能分解表
我的世界里的修仙服务器
盈克网络技术推广
数据库设计中的供货商
服务器的并发是什么
南京智能化联想服务器供应商
网络安全手抄报简单的文字
使用python写数据库
软件开发招聘年龄
合肥软件开发怎么样
2019年网络安全检查报告
网络数据库技术 基础