三个线程顺序执行的实现方法是什么
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本篇内容主要讲解"三个线程顺序执行的实现方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"三个线程顺序执行的实现方法是什么"吧!先说下要求,就是三个
千家信息网最后更新 2025年02月02日三个线程顺序执行的实现方法是什么
本篇内容主要讲解"三个线程顺序执行的实现方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"三个线程顺序执行的实现方法是什么"吧!
先说下要求,就是三个线程,假设是线程 1,2,3, 现在的要求是:必须是线程 1 先执行,然后线程 2 再执行,最后是线程 3 执行,然后有几种实现方法呢?
其实它的本质就是实现,让线程 2,3 等待线程 1 执行完毕,所以重点就是有哪些方法可以让线程 2,3 等待。
join
第一反应应该就是使用 join 方法,因为 join 本来就是支持这种机制的
比如,我在线程 B 中调用了线程 A 的 join 方法,那么线程 B 就会等线程 A 执行结束之后再执行
那么具体应该怎么使用嘞?
别慌嘛,我这里有例子,你瞅瞅:
public class ThreadLoopOne { public static void main(String[] args) { Thread t1 = new Thread(new Work(null)); Thread t2 = new Thread(new Work(t1)); Thread t3 = new Thread(new Work(t2)); t1.start(); t2.start(); t3.start(); } static class Work implements Runnable { private Thread beforeThread; public Work(Thread beforeThread){ this.beforeThread = beforeThread; } @Override public void run() { // 如果有线程,就 join 进来,没有的话就直接输出 if (beforeThread != null ){ try { beforeThread.join(); System.out.println("thread start : " + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } }else{ System.out.println("thread start : " + Thread.currentThread().getName()); } } } }
CountDownLatch
刚才说了,本质就是让线程 B,C 等待线程 A 执行完毕
那么信号量就是一个不错的选择
如果想要实现的话,那大概就是下面这样:
public class ThreadLoopTwo { public static void main(String[] args) { // 设置线程 1 的信号量为 0 CountDownLatch cOne = new CountDownLatch(0); // 设置线程 2 的信号量为 1 CountDownLatch cTwo = new CountDownLatch(1); // 设置线程 3 的信号量为 1 CountDownLatch cThree = new CountDownLatch(1); // 因为 cOne 为 0 ,故 t1 可以直接执行 Thread t1 = new Thread(new Work(cOne,cTwo)); // 线程 t1 执行完毕之后,此时的 cTwo 为 0 , t2 开始执行 Thread t2 = new Thread(new Work(cTwo,cThree)); // 线程 t2 执行完毕,此时 cThree 为 0 , t3 开始执行 Thread t3 = new Thread(new Work(cThree,cThree)); t1.start(); t2.start(); t3.start(); } static class Work implements Runnable{ CountDownLatch cOne; CountDownLatch cTwo; public Work(CountDownLatch cOne, CountDownLatch cTwo){ super(); this.cOne = cOne; this.cTwo = cTwo; } @Override public void run() { try { // 当前一个线程信号量为 0 时,才执行 cOne.await(); System.out.println("thread start : " + Thread.currentThread().getName()); // 后一个线程信号量减 1 cTwo.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
使用单个线程池
之所以线程 1,2,3 的执行顺序无法保证,是因为在编译器可能会去做一些优化,导致没有办法按照顺序执行
如果我们使用单个线程池去执行的话,那就没有这样的问题了
具体实现:
public class ThreadLoopThree { public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("thread start : " + Thread.currentThread().getName() + " run one"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { System.out.println("thread start : " + Thread.currentThread().getName() + " run two"); } }); Thread t3 = new Thread(new Runnable() { @Override public void run() { System.out.println("thread start : " + Thread.currentThread().getName() + " run three"); } }); ExecutorService executor = Executors.newSingleThreadExecutor(); // 将线程依次加入到线程池中 executor.submit(t1); executor.submit(t2); executor.submit(t3); // 及时将线程池关闭 executor.shutdown(); } }
CompletableFuture
如果使用 CompletableFuture 来实现的话,代码就非常简洁了
public class ThreadLoopFour { public static void main(String[] args) { Thread t1 = new Thread(new Work()); Thread t2 = new Thread(new Work()); Thread t3 = new Thread(new Work()); CompletableFuture.runAsync(()-> t1.start()) .thenRun(()->t2.start()) .thenRun(()->t3.start()); } static class Work implements Runnable{ @Override public void run() { System.out.println("thread start : " + Thread.currentThread().getName()); } } }
到此,相信大家对"三个线程顺序执行的实现方法是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
线程
方法
就是
信号
信号量
顺序
三个
内容
单个
本质
学习
不错
实用
更深
简洁
之所以
代码
例子
兴趣
办法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
智慧工地软件开发公司
服务器架构图软件有哪些
工业互联网 长信科技
疯狂网络技术有限公司
嵌入式软件开发的阶段
未成年人怎么学习网络安全知识
数据库怎么做分页
医院网络安全宣传工作总结
中控考勤机怎样建2个数据库
国产数据库软件支持gis
数据库安全技术好学吗
5g软件开发工程师
ipv6网络安全
服务器能直接接磁盘柜吗
出差软件开发好不好
智慧电力网络安全与技术
昆明南天住房补贴软件开发公司
攀枝花游戏辅助软件开发公司
株洲网络安全问题
徐州运营网络技术咨询热线
服务器更改超级管理员
云服务器怎么买优惠
智能化软件开发不二之选
财务软件开发书籍
杭州快象网络技术做什么的
上海雷悍网络技术
恐龙岛蓬莱岛服务器
边锋网络技术有限公司好吗
福建船政计算机网络技术
网络安全真能标准化吗