多线程知识04

新建 T1、T2、T3 三个线程,如何保证它们按顺序执行

     

在Java中,可以使用线程的join()方法来保证线程的顺序执行。join()方法会将线程暂停,直到调用该方法的线程结束执行为止。

以下是创建T1、T2、T3三个线程,并按顺序执行的示例代码:

public class Main {public static void main(String[] args) {Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("T1 is running");}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {try {t1.join();  // 等待T1线程执行完成} catch (InterruptedException e) {e.printStackTrace();}System.out.println("T2 is running");}});Thread t3 = new Thread(new Runnable() {@Overridepublic void run() {try {t2.join();  // 等待T2线程执行完成} catch (InterruptedException e) {e.printStackTrace();}System.out.println("T3 is running");}});t1.start();t2.start();t3.start();}
}

在上述代码中,我们创建了三个线程T1、T2、T3,并分别使用join()方法来保证它们按顺序执行。在T2的run()方法中,首先调用t1.join(),表示等待T1线程执行完成后再执行。在T3的run()方法中,同样调用t2.join(),表示等待T2线程执行完成后再执行。

当main方法中的t1.start()、t2.start()、t3.start()被调用时,线程T1、T2、T3会同时开始执行。然而,由于在T2、T3线程中调用了join()方法,它们会暂停执行,直到被等待的线程执行完成。

这样,就可以保证T1、T2、T3三个线程按顺序执行。输出结果将是:

T1 is running
T2 is running
T3 is running

注意:在实际开发中,线程的执行顺序会受到许多因素的影响,例如线程调度、时间片分配等。使用join()方法可以保证指定线程执行完成后再执行下一个线程,但不能保证线程的绝对顺序执行。

怎么控制同一时间只有 3 个线程运行

     在Java中,可以使用Semaphore(信号量)来控制同时运行的线程数量。Semaphore是一种并发控制工具,它可以指定同时能够访问某个资源或者执行某个操作的线程数量。

下面是一个例子,说明如何使用Semaphore来实现同一时间只有3个线程运行:

import java.util.concurrent.Semaphore;public class ThreadControlExample {public static void main(String[] args) {// 创建Semaphore对象,指定允许同时运行的线程数量为3Semaphore semaphore = new Semaphore(3);// 创建10个线程并启动for (int i = 0; i < 10; i++) {Thread thread = new MyThread(semaphore, i);thread.start();}}static class MyThread extends Thread {private Semaphore semaphore;private int threadId;public MyThread(Semaphore semaphore, int threadId) {this.semaphore = semaphore;this.threadId = threadId;}public void run() {try {System.out.println("Thread " + threadId + " is waiting");// 获取Semaphore许可semaphore.acquire();System.out.println("Thread " + threadId + " is running");// 模拟线程的执行Thread.sleep(2000);System.out.println("Thread " + threadId + " is finished");} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放Semaphore许可semaphore.release();}}}
}

上述代码中,我们创建了一个Semaphore对象,并将允许同时运行的线程数量设置为3。然后我们创建了10个线程,并在每个线程中先调用acquire()方法获取Semaphore的许可,然后执行具体的业务逻辑,最后在finally块中调用release()方法释放Semaphore的许可。

在运行过程中,最多只会有3个线程同时运行,其余线程会等待直到有空闲的许可。当一个线程完成任务并释放许可之后,等待的线程中会有一个线程获取到许可并开始执行任务。

需要注意的是,在acquire()方法和release()方法之间的代码需要保证原子性,以避免释放了没有获取到的许可。

总结 

     Semaphore是Java中的一个并发工具,用于控制多个线程的访问某个共享资源的数量。下面是关于Semaphore对象的总结:

  1. Semaphore是一个计数信号量,用来表示当前可用的资源数量。它有一个初始值,每次调用acquire()方法时,Semaphore的计数减1;每次调用release()方法时,Semaphore的计数加1。

  2. Semaphore可以用来限制某个资源的并发访问数量。比如,如果有3个资源可供访问,可以创建一个初始值为3的Semaphore对象,然后每个线程在访问资源之前都要调用acquire()方法获取许可,访问完之后调用release()方法释放许可。

  3. Semaphore可以用来控制线程的执行顺序。比如,可以创建一个初始值为0的Semaphore对象,然后某个线程在执行到某个特定点时调用acquire()方法获取许可,然后等待其他线程执行完毕后再继续执行。

  4. Semaphore还可以用来实现互斥锁的功能。通过创建一个初始值为1的Semaphore对象,并在临界区的开始和结束时分别调用acquire()和release()方法,可以实现只有一个线程能够访问临界区的效果。

  5. Semaphore还有一个特殊的构造函数Semaphore(int permits, boolean fair),其中permits参数表示初始许可的数量,fair参数表示是否使用公平性策略。如果fair参数为true,Semaphore会按照线程的到达顺序来获取许可。

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

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

相关文章

python项目的数据库迁移工具,类似于Flyway的数据库迁移工具有那些?

Python项目中常用的数据库迁移工具主要有以下几种: Alembic: 这是一个轻量级的数据库迁移工具,主要用于SQLAlchemy项目。它通过版本控制来跟踪和管理数据库模式的变更。 Django Migrations: Django框架自带的迁移工具,用于创建和应用数据库模式变更。 Flask-Migrate: 基于Ale…

《探索 IT 行业的无限可能》

你眼中的IT行业现状与未来趋势 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是怎么样的&#xf…

工业制造企业为什么要进行数字化转型

人人都在谈数字化转型&#xff0c;政府谈数字化策略方针&#xff0c;企业谈数字化转型方案&#xff0c;员工谈数字化提效工具。互联网企业在谈&#xff0c;工业企业也在谈。 在这种大趋势下&#xff0c;作为一个从事TOB行业十年的老兵&#xff0c;今天就来给大家讲讲&#xff…

【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码

文章目录 通讯录管理系统一、系统需求以及成品演示二、代码实现三、完整代码 通讯录管理系统 一、系统需求以及成品演示 1.1 系统需求 通讯录是一个可以记录亲人、好友信息的工具。这里利用C来实现一个通讯录管理系统 系统中需要实现的功能如下&#xff1a; 添加联系人&am…

spring boot 之 接口参数校验

引入pom依赖 <!--参数校验--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>统一返回结果封装 import lombok.Data;import java.io.Serializa…

申请的商标名称相同或近似,如何解决!

最近遇到一些首次申请注册商标的主体&#xff0c;基本想的名称都是两个字或或者两个字加通用词&#xff0c;还有用的行业描述词或缺乏显著特征词&#xff0c;这样去申请注册商标&#xff0c;普推知产老杨分析这样去直接申请注册大概率驳回。 两个字基本上注册的差不多了&#…

Ubuntu 20.04中用scrapy爬取博客园新闻首页的简单示例

一、梳理scrapy项目目录创建&#xff1a; 1、命令行终端定位到pycharm主目录&#xff1a;cd PycharmProjects 2、建立项目名称&#xff1a;scrapy startproject searchArticle 3、定位到项目目录下&#xff1a;cd searchArticle 4、设置爬虫名称与欲爬取的域名地址&#xf…

可变参数函数

可变参数函数指的是函数的参数个数可变&#xff0c;参数类型不定的函数。 C提供了两种主要的方法&#xff1a; &#xff08;1&#xff09;如果所有的实参类型相同&#xff0c;可以传递一个名为initializer_list的标准库类型。 &#xff08;2&#xff09;如果所有的实参类型不完…

为什么c语言不对0和NULL做严格的区分?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;这个答案很简单:c语言不区分…

上海亚商投顾:沪指冲高回落 电力、电网产业链持续爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指、创业板指均跌超1%。电力、电网股再度爆发&#xff0c;众智科技、郴电国…

展望跨境智慧银行在全球化金融服务中的发展趋势和机遇

一、引言 随着全球经济的不断融合和金融科技的迅猛发展,跨境智慧银行作为连接不同国家和地区金融市场的桥梁,正逐渐展现出其独特的魅力和潜力。跨境支付与结算作为跨境智慧银行的核心业务之一,随着全球化的深入发展和国际贸易的日益频繁,其业务场景也愈发丰富和复杂。本文…

武大深度学习期末复习-常见神经网络概念

深度学习经典神经网络概念、优缺点及应用场景 文章目录 一、多层感知机&#xff08;MLP&#xff09;1.1 结构和原理1.2 优缺点1.3 应用场景 二、卷积神经网络&#xff08;CNN&#xff09;2.1 结构和原理2.2 优缺点2.3 应用场景 三、循环神经网络&#xff08;RNN&#xff09;3.1…

15.微信小程序之async-validator 基本使用

async-validator是一个基于 JavaScript 的表单验证库&#xff0c;支持异步验证规则和自定义验证规则 主流的 UI 组件库 Ant-design 和 Element中的表单验证都是基于 async-validator 使用 async-validator 可以方便地构建表单验证逻辑&#xff0c;使得错误提示信息更加友好和…

#笔记#笔记#其他

大鱼论文是一款非常靠谱、方便、值得推荐的论文写作工具。无论是在学术研究中还是在日常写作中&#xff0c;大鱼论文都能够帮助用户轻松完成论文的写作工作。 首先&#xff0c;大鱼论文提供了强大的查重降重功能&#xff0c;能够帮助用户快速定位论文中可能存在的抄袭问题&…

Xcode 15 libarclite 缺失问题

升级到Xcode 15运行项目报错&#xff0c;报错信息如下&#xff1a; SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum d…

电力业务模型

电力业务模型 目录概述需求&#xff1a; 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy…

华为超融合数据中心网络【笔记】

对动态流量和海量参数调整&#xff0c;提炼出不同的流量特征模型&#xff1b;在交换机中实时采集流量特征和网络状态&#xff0c;使用独创的iLossless智能无损算法&#xff0c;本地实时决策并动态调整网络参数配置&#xff0c;使得交换机缓存被合理高效利用&#xff0c;实现整网…

基于PHP+MySQL组合开发的720VR全景小程序源码系统 一键生成三维实景 前后端分离带网站的安装代码包以及搭建教程

系统概述 这款源码系统是专门为实现 720VR 全景展示而设计的。它结合了先进的技术和创新的理念&#xff0c;能够将真实场景以全景的形式呈现给用户&#xff0c;让用户仿佛身临其境。该系统采用 PHP 进行后端开发&#xff0c;MySQL 作为数据库管理系统&#xff0c;确保了系统的…

debian 常用命令

Debian 是一个广泛使用的 Linux 发行版&#xff0c;这里列出了一些常用的 Debian 命令&#xff0c;适用于系统管理和日常使用&#xff1a; ### 文件与目录操作 1. **ls** - 列出目录内容&#xff1a; bash ls ls -l # 长格式显示 ls -a # 显示所有文件&#xff…

G60-M60F-ZQ手动抓取快速接头,专用于吊装设备的重物快速抓取

客户需求概述&#xff1a; 客户需要将重达将近400公斤的产品从一个工作台移动至另一个工作台&#xff0c;目前的方法是通过人工将吊环的螺纹与产品的螺纹相互拧紧&#xff0c;然后利用装备吊起移动&#xff0c;但这种方式效率低下&#xff0c;且因为工人的操作有时难以达到理想…