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

文章目录

  • 1. 使用 join 方法
  • 2. 使用 CountDownLatch
  • 3. 使用 Semaphore
  • 4. 使用 ReentrantLock 和 Condition
  • 5. 使用 BlockingQueue

1. 使用 join 方法

通过使用 Thread.join 方法,可以确保一个线程在另一个线程完成后再开始执行。

public class JoinExample {public static void main(String[] args) {Thread t1 = new Thread(() -> {System.out.println("T1 is running");});Thread t2 = new Thread(() -> {try {t1.join();System.out.println("T2 is running");} catch (InterruptedException e) {e.printStackTrace();}});Thread t3 = new Thread(() -> {try {t2.join();System.out.println("T3 is running");} catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();t3.start();}
}

2. 使用 CountDownLatch

通过使用 CountDownLatch,可以确保线程按顺序执行。

import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) {CountDownLatch latch1 = new CountDownLatch(1);CountDownLatch latch2 = new CountDownLatch(1);Thread t1 = new Thread(() -> {System.out.println("T1 is running");latch1.countDown();});Thread t2 = new Thread(() -> {try {latch1.await();System.out.println("T2 is running");latch2.countDown();} catch (InterruptedException e) {e.printStackTrace();}});Thread t3 = new Thread(() -> {try {latch2.await();System.out.println("T3 is running");} catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();t3.start();}
}

3. 使用 Semaphore

使用 Semaphore 可以控制线程的执行顺序。

import java.util.concurrent.Semaphore;public class SemaphoreExample {public static void main(String[] args) {Semaphore sem1 = new Semaphore(0);Semaphore sem2 = new Semaphore(0);Thread t1 = new Thread(() -> {System.out.println("T1 is running");sem1.release();});Thread t2 = new Thread(() -> {try {sem1.acquire();System.out.println("T2 is running");sem2.release();} catch (InterruptedException e) {e.printStackTrace();}});Thread t3 = new Thread(() -> {try {sem2.acquire();System.out.println("T3 is running");} catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();t3.start();}
}

4. 使用 ReentrantLock 和 Condition

使用 ReentrantLock 和 Condition 可以更细粒度地控制线程的执行顺序。

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class LockConditionExample {private static final Lock lock = new ReentrantLock();private static final Condition condition1 = lock.newCondition();private static final Condition condition2 = lock.newCondition();private static boolean t1Finished = false;private static boolean t2Finished = false;public static void main(String[] args) {Thread t1 = new Thread(() -> {lock.lock();try {System.out.println("T1 is running");t1Finished = true;condition1.signal();} finally {lock.unlock();}});Thread t2 = new Thread(() -> {lock.lock();try {while (!t1Finished) {condition1.await();}System.out.println("T2 is running");t2Finished = true;condition2.signal();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}});Thread t3 = new Thread(() -> {lock.lock();try {while (!t2Finished) {condition2.await();}System.out.println("T3 is running");} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}});t1.start();t2.start();t3.start();}
}

5. 使用 BlockingQueue

通过使用 BlockingQueue 可以控制线程的执行顺序。

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class BlockingQueueExample {public static void main(String[] args) {BlockingQueue<String> queue1 = new ArrayBlockingQueue<>(1);BlockingQueue<String> queue2 = new ArrayBlockingQueue<>(1);Thread t1 = new Thread(() -> {System.out.println("T1 is running");try {queue1.put("T1 done");} catch (InterruptedException e) {e.printStackTrace();}});Thread t2 = new Thread(() -> {try {queue1.take();System.out.println("T2 is running");queue2.put("T2 done");} catch (InterruptedException e) {e.printStackTrace();}});Thread t3 = new Thread(() -> {try {queue2.take();System.out.println("T3 is running");} catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();t3.start();}
}

这些方法都可以确保线程按指定顺序执行,选择哪种方法取决于具体的使用场景和需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单机小游戏好上架的应用市场有哪些?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Vue3中的常见组件通信(超详细版)

Vue3中的常见组件通信 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs4. 默认…

Mac电脑FTP客户端推荐:Transmit 5 for Mac 中文版

Transmit 5是一款专为macOS平台设计的功能强大的FTP&#xff08;文件传输协议&#xff09;客户端软件。Transmit 5凭借其强大的功能、直观易用的界面和高效的性能&#xff0c;成为需要频繁进行文件传输和管理的个人用户和专业用户的理想选择。无论是对于新手还是经验丰富的用户…

Starlink全系卫星详细介绍,波段频谱、激光星间链路技术、数据传输速率等等

Starlink全系卫星详细介绍&#xff0c;波段频谱、激光星间链路技术、数据传输速率等等。 Starlink是SpaceX公司开发的一个低轨道&#xff08;LEO&#xff09;卫星网络系统&#xff0c;旨在为全球用户提供高速宽带互联网服务。截至2024年6月&#xff0c;Starlink已经发射并运行…

终于找到了免费的云服务器

今天朋友推荐了一个免费的云服务器&#xff1a;“阿贝云” 我最喜欢的是它的"免费虚拟主机"“免费云服务器”&#xff0c;省了我好多钱&#xff0c;我的使用感受是用起来经济实惠省心&#xff0c;不要钱的东西谁不喜欢呢&#xff0c;对于普通开发者来说&#xff0c;…

C# —— 三目运算符及实例

三目运算符基本语法 三目运算符: 套路 三个空位 两个符号 固定写法: 空位1 ? 空位2 &#xff1a; 空位3 关键信息: bool类型 ? bool类型返回为真时的内容 &#xff1a; bool类型返回为假时的内容 string str true ? "条…

长尾式差分放大电路调零

长尾式放大电路用了两个参数相同的三极管&#xff0c;但实际上并没有完全相同的三极管&#xff0c;所以为了提高差分放大电路的对称性(一边电流增加多少&#xff0c;另一边电流减小多少&#xff0c;即能在电阻Re上产生的压降不变(后面做虚地处理))&#xff0c;在下图中加入可调…

【Linux 杂记】TOP命令

top命令用于动态显示系统中正在运行的进程的详细信息&#xff0c;以及系统的整体资源使用情况。以下是其主要输出解释&#xff1a; Header 表头信息&#xff1a; top&#xff1a;当前时间和运行时间。Tasks&#xff1a;进程统计信息&#xff0c;如总进程数、运行中、睡眠中等。…

SaaS 难,传统软件不难?AIGC 不难?

近年来&#xff0c;中国的软件市场风起云涌&#xff0c;各种新技术、新模式层出不穷。其中&#xff0c;SaaS&#xff08;软件即服务&#xff09;作为一种新兴的商业模式&#xff0c;备受瞩目。然而&#xff0c;正如许多行业人士所指出的&#xff0c;中国的SaaS市场确实面临着诸…

C# 用RFC的方式调用SAP接口

假如我们有一个SAP的接口文档 ZED_GET_PO Note Parameter Name "Type - F. Field - S. Structure - T. Table" Associated Type "Mandatory - Y. Yes - N. No" Data Type Length Note 传入数据 IM_EBELN F Y CHAR 10 PO号码 传出数据 EX_HEAD S Z…

Springboot开发之 Excel 处理工具(一) -- Apache POI

一、简介 Apache POI&#xff08;Poor Obfuscation Implementation&#xff09;是一个用Java编写的免费开源的跨平台Java API&#xff0c;它提供了对Microsoft Office格式文档的读写功能。 1. poi 的核心功能&#xff1a; 读取Excel&#xff1a;支持读取旧版Excel格式&#…

xocde编辑器支持修改为中文吗?不支持

xocde编辑器支持修改为中文吗&#xff1f; 不支持

rttys服务器和客户端

rttys服务器 1.下载 https://github.com/zhaojh329/rttys/releases2.解压运行 libev交叉编译 cd libev ./configure --hostarm-linux CCaarch64-poky-linux-gcc --prefix/home/michael/rtty_install make install DESTDIR/home/michael/rtty_installrtty客户端 1.git地…

RabbitMQ —— 理解及应用场景

一、MQ相关的概念 RabbitMQ 是一种分布式消息中间件&#xff0c;消息中间件也称消息队列MQ&#xff0c;那么什么是MQ呢&#xff1f;请继续阅读下文。 1.1、MQ的基本概念 什么是MQ MQ(message queue)&#xff0c;从字面意思上看就个 FIFO 先入先出的队列&#xff0c;只不过队列…

2024 年解锁 Android 手机的 7 种简便方法

您是否忘记了 Android 手机的 Android 锁屏密码&#xff0c;并且您的手机已被锁定&#xff1f;您需要使用锁屏解锁 Android 手机&#xff1f;别担心&#xff0c;您不是唯一一个忘记密码的人。我将向您展示如何解锁 Android 手机的锁屏。 密码 PIN 可保护您的 Android 手机和 G…

Node.js中基于node-schedule实现定时任务之详解

文章目录 一、定时任务二、node-schedule、1、安装2、引入3、基于Cron表达式的规则4、基于Date的规则5、基于RecurrenceRule的规则6、API7、状态监听 一、定时任务 实际工作中&#xff0c;可能会遇到定时清除某个文件夹内容&#xff0c;定时发送消息或发送邮件给指定用户&…

Django集成OpenAI

Django集成OpenAI 通过前面 django 框架的基本开发知识&#xff0c;我们现在可以开始在 django 上做稍微深一点当然应用开发了。 这一章开始编写怎么集成调用 openai &#xff0c;设置环境以及 openai 的基础知识。 大家都知道 ai 的多模态逐渐扩大&#xff0c;各种应用层出…

怎么采集阿里巴巴1688的商品或商家数据?

怎么使用简数采集器批量采集阿里巴巴1688的商品或商家相关信息呢&#xff1f; 简数采集器暂时不支持采集阿里巴巴1688的相关数据&#xff0c;谢谢。 简数采集器采集网络网页数据非常简单高效&#xff1a;输入要采集的网址&#xff0c;简数智能算法会自动提取出网页上的关键信…

探索数据结构:集合、线性结构、树状结构和图形结构

在计算机科学中&#xff0c;数据结构是用于组织和存储数据的基础。不同的数据结构有不同的特点和适用场景。今天&#xff0c;我们将深入探讨四种主要的数据结构&#xff1a;集合、线性结构、树状结构和图形结构。通过对它们的理解&#xff0c;您可以更好地选择和应用这些结构来…

IOS Swift 从入门到精通:算术运算,运算符重载,符合赋值运算,比较运算,条件,结合条件,三元运算,Swift语句,范围运算

目录 算术运算符 运算符重载 复合赋值运算符 比较运算符 条件 结合条件 三元运算符 Switch 语句 范围运算符 总结 算术运算符 现在您已经了解了 Swift 中的所有基本类型&#xff0c;我们可以开始使用运算符将它们组合在一起。运算符是那些像和 这样的小数学符号-&…