当前位置:网站首页>阿里一面:多线程顺序运行有多少种方法?
阿里一面:多线程顺序运行有多少种方法?
2022-07-30 05:50:00 【chenxuyuana】
文章介绍4种方法,简单易懂,通过4个demo抛砖引玉。
1、在子线程中通过join()方法指定顺序
通过join()方法使当前线程“阻塞”,
“”
运行结果:
2、在主线程中通过join()方法指定顺序
子线程指的是发生在Thread内部的代码,主线程指的是发生在main函数中的代码。最新多线程面试题整理好了,点击Java面试库小程序在线刷题。
我们可以在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();
}
}
打开冰箱!
拿出一瓶牛奶!
关上冰箱!
单线程化线程池(newSingleThreadExecutor)的优点,串行执行所有任务。
输出结果:
打开冰箱!拿出一瓶牛奶!
关上冰箱!
边栏推荐
- Advanced multi-threading (CountDownLatch, deadlock, thread-safe collection class)
- 基于 JupyterLab 插件在 GraphScope 中交互式构图
- Bull: remove common characters
- flask项目快速搭建部署gunicorn+supervisor
- 04-packing and unpacking
- Test Development Engineer Growth Diary 001 - Some Introduction to Agile Testing, CI/CD/CT, DecOps
- Interactively compose graphs in GraphScope based on the JupyterLab plugin
- 引导过程与服务控制
- 测开基础知识02
- Test the basics 02
猜你喜欢

Dachang's annual salary of 50w+ recruits test engineers with test platform development capabilities

多线程进阶(锁策略,自旋+CAS,Synchronized,JUC,信号量)

I can't hide it, I want to expose the bad things about cloud native

向量三重积的等式推导证明

引导过程与服务控制

GAIA-IR:GraphScope 上的并行化图查询引擎

Selenium02

牛客:删除公共字符

About memcache kernel, so one of the most popular

GNNLab: A Novel GNN System Based on Spatial Sharing Ideas
随机推荐
idea内置翻译插件
Advanced multi-threading (lock strategy, spin+CAS, Synchronized, JUC, semaphore)
MongoDB-CUD没有R
软件测试术语 - 场景测试
05-Theos
向量叉乘的几何意义及其模的计算
用 GraphScope 像 NetworkX 一样做图分析
Mastering JESD204B (3) – Debugging of AD6676
如何使用xilinx的FFT ip
MongoDB-查询
MongoDB - query
【Untitled】
Graph analysis like NetworkX with GraphScope
prometheus监控nacos
空间直线到平面上的交点的计算证明及其源码
图计算在网络安全分析中的应用
测开基础知识01
Network Protocol 04 - Physical and Data Link Layers
Rapidly develop GraphScope graph analysis applications
Swagger使用方式,告别postman