当前位置:网站首页>多线程顺序运行的 4 种方法,面试随便问!
多线程顺序运行的 4 种方法,面试随便问!
2022-07-29 14:50:00 【Java技术栈】
文章介绍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/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();
}
}输出结果:
打开冰箱!
拿出一瓶牛奶!
关上冰箱!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最新版)
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
觉得不错,别忘了随手点赞+转发哦!
边栏推荐
- C语言 5:bool类型,关系表达式,逻辑表达式,分支语句,函数调用机制,break,continue,goto,return/exit跳转语句
- 深度卷积生成对抗网络
- 电视处理器a53和a55哪个厉害(cortexa55处理器好吗)
- 深度学习-神经网络
- AOP implementation enterprise API access interface monitoring (via Google Guava cache data)
- 微服务实战|集中配置中心Config非对称加密与安全管理
- Numpy
- 【LeetCode】217. 存在重复元素
- 字典树笔记(自用)
- Replay Online Traffic Tool - GoReplay
猜你喜欢

CNCF Keith Chan:分布式云时代,云原生社区的发展与趋势

Realization of Online Chat System Based on SSM

这 6 款在线 PDF 转换工具,得试

dedecms编辑器支持pdf导入

【IIC通信】Chap.1(I2C)IIC通信原理、IIC读写时序详解

换掉 UUID,更快、更安全!

疫情之下的裁员浪潮,7点建议帮你斩获心仪offer

hyperbench:plugin.Open(“./fabric“): plugin was built with a different version of package golang.

How to get local json

数据分析(二)
随机推荐
数字孪生万物可视 |联接现实世界与数字空间
c语言字符和字符串总结
Principles Of Mathematical Analysis, Third Edition免费下载地址
dedecms编辑器支持pdf导入
关于数字化转型 你需要知道的八项指导原则
AVH部署实践 (一) | 在Arm虚拟硬件上部署飞桨模型
redis常见面试题(背诵篇)
AOP实现企业级API访问接口监控(通过Google Guava缓存数据)
ArcGIS Molder Builder模型构建器基本知识
什么是异构计算
QT通过UDP分包传输大图像(测试可传6M)
C语言 3:常量和变量,顺序语句,选择语句,循环语句,作用域和生存期
自动化配置SSH免密登录和取消SSH免密配置脚本
如何使用SparkSQL做一些简单的数据分析和可视化展示?
【C语言】AI三子棋的成长之路
【微服务】(十六)—— 分布式事务Seata
AC自动机笔记与例题整理
全球级的分布式数据库 Google Spanner原理 热:报错
微机原理之指令系统和汇编程序设计
工业设备数字孪生技术,解决方案系统平台案例