有三个线程T1,T2,T3,如何它们保证顺序执行?

news/2024/10/30 1:01:33/

目录

一、使用join方法

二、使用CountDownLatch(闭锁):

三、使用单个线程池:


一、使用join方法

        使用 join() 方法可以保证线程的顺序执行。在 Java 中,join() 方法是用来等待一个线程执行完成的方法,当调用某个线程的 join() 方法时,当前线程会被阻塞,直到该线程执行完成后才会继续执行。

具体来说,我们可以在 T1 线程结束时调用 T2 的 join() 方法,这样 T2 就会等待 T1 执行完成后再开始执行;同理,在 T2 结束时调用 T3 的 join() 方法,以确保 T3 在 T2 执行完成后才开始执行。这样就可以保证 T1、T2、T3 按照顺序依次执行。

public class ThreadJoinDemo {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> System.out.println("t1"));Thread t2 = new Thread(() -> System.out.println("t2"));Thread t3 = new Thread(() -> System.out.println("t3"));t1.start();t1.join();  // 等待 t1 执行完成t2.start();t2.join();  // 等待 t2 执行完成t3.start();t3.join();  // 等待 t3 执行完成}}

二、使用CountDownLatch闭锁):

        使用 CountDownLatch(闭锁)方法可以保证线程的顺序执行。CountDownLatch 是一个同步工具类,它可以让某个线程等待多个线程完成各自的工作之后再继续执行。具体来说,我们可以使用两个 CountDownLatch 对象 latch1latch2 分别控制 T1、T2、T3 线程的执行顺序。

初始时,latch1 的计数器为1,latch2 的计数器为2。当 T1 执行完毕时,调用 latch1.countDown() 方法通知 T2 可以开始执行;当 T2 执行完毕时,调用 latch2.countDown() 方法通知 T3 可以开始执行。这样就可以确保 T1、T2、T3 按照顺序依次执行。

在 main 方法中,我们分别启动 T1、T2、T3 线程,然后等待它们执行完毕。需要注意的是,在使用 CountDownLatch 方法时,需要确保计数器的值正确设置,并且每个线程都能够独立执行完成,并且不会相互影响,以避免出现死锁等问题。

        

import java.util.concurrent.CountDownLatch;public class ThreadCountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch latch1 = new CountDownLatch(1);CountDownLatch latch2 = new CountDownLatch(2);Thread t1 = new Thread(() -> {System.out.println("t1");latch1.countDown();});Thread t2 = new Thread(() -> {try {latch1.await();  // 等待 t1 执行完成System.out.println("t2");latch2.countDown();} catch (InterruptedException e) {e.printStackTrace();}});Thread t3 = new Thread(() -> {try {latch2.await( ); // 等待 t2 执行完成System.out.println("t3");} catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();t3.start();t1.join();t2.join();t3.join();}}

三、使用单个线程池

        使用单个线程池可以保证t1、t2、t3顺序执行,因为单个线程池只有一个工作线程每次只会执行一个任务。我们可以将t1、t2、t3三个任务按照顺序提交给单个线程池,这样就可以确保它们按照顺序依次执行。

        注意的是,在使用线程池时,需要确保每个任务都能够独立执行完成,并且不会相互影响,以避免出现线程安全等问题。

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ThreadOrderDemo {private static ExecutorService executorService = Executors.newSingleThreadExecutor();public void t1() {System.out.println("t1");}public void t2() {System.out.println("t2");}public void t3() {System.out.println("t3");}public static void main(String[] args) {ThreadOrderDemo demo = new ThreadOrderDemo();executorService.submit(demo::t1);executorService.submit(demo::t2);executorService.submit(demo::t3);executorService.shutdown();}}


http://www.ppmy.cn/news/62097.html

相关文章

德国 DocuWare 文档管理软件平台

DocuWare 是一个先进的平台,可让您集中、快速、有效地管理、处理和利用业务信息。 我们的文档管理和工作流程解决方案的各项功能可以集成到任何 IT 系统中,可以数字化任何部门的手动或纸质业务流程。提高您公司的生产力,让您的团队更轻松地完…

《走进对象村4》之面向对象的第一大特性——封装

文章目录 🚀文章导读1、封装的概念2、访问限定修饰符3、如何进行封装4、封装的优点: 🚀文章导读 在本篇文章中,将详细的对封装进行总结,文章仅仅是个人的一些理解,如果有错误的地方,还望指出看完…

易观千帆 | Q1运营报告:手机银行MAU超5.3亿,行业“内卷”超出想象

易观:由中国电子银行网、易观分析联合发布的“2023中国手机银行综合运营报告”显示:在经济企稳回升的大背景下,中国手机银行第一季度综合运营指数季度内呈平稳上升态势,手机银行活跃人数环比增幅逐月递增,促使活跃用户…

优先级队列priority_queue模拟实现

优先级队列priority_queue模拟实现 1.优先级队列介绍2.模拟实现 🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【C的学习】 📝📝本篇内容:…

ThingsBoard 接入摄像头方案

0、上图 废话不多说,先给大家来个效果图: 1、概述 最近,我在群里看到有很多兄弟向我咨询摄像头接入到tb的方案,这个就是找对人了,后续我会截图我当初做的东西,其实这个很简单,而且我这种方法是最好的,下面给大家一一道来。 我总结了下面几种情况,其实关键在于摄像头…

数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年4月刊

本文为大家整理了墨天轮数据社区2023年4月发布的优质技术文章,主题涵盖Oracle、MySQL、PostgreSQL等数据库的基础安装配置、故障处理、性能优化等日常实践操作,以及概念梳理、常用脚本、注意事项等总结记录,分享给大家: Oracle优…

Linux用户操作

查看用户:cat /etc/passwd(passwd是系统用户配置文件,存储了系统中所有用户的基本信息) 查看用户密码:cat /etc/shadow 查看用户组:cat /etc/group 查看用户组密码:cat /etc/gshaow 查看当前活跃的用户列表&#xff1a…

常见sql问题备注

样例数据输出: select * from 某表 limit 1; 将查询结果选中然后按制表符,得到竖着的样例数据格式。 星环(hive sql)添加表名注释和字段注释: alter table sjh_cdhouse.tablename SET TBLPROPERTIES(co…