多线程的创建与同步
目录
线程的创建
1.多线程的创建:方式一:继承于Thread类
2.多线程的创建:方式二:实现Runnable
3..线程创建方式三:实现Callable接口
线程的同步
1.同步的方式:方式一:同步代码块
2.同步的方式二:同步方法:
3.线程同步的方法三:Lock锁
4.案例:三个线程交替打印数组元素
线程的创建
1.多线程的创建:方式一:继承于Thread类
1.创建一个继承于thread类的子类。
2.重写thread类的run()
3.创建thread类的子类的对象
4.通过此对象调用start()
public class MyThreadTest {public static void main(String[] args) {//3.创建Thread类的子类的对象Thread1 thread1 = new Thread1();//4.通过该对象调用start()方法thread1.start();}}
//1.创建一个继承了Thread类的子类
class Thread1 extends Thread {//2.重写Thread类的run()方法@Overridepublic void run() {System.out.println("线程实现方式一:继承Thread类方式");}
}
2.多线程的创建:方式二:实现Runnable
1.创建一个实现了Runnable接口的类
2.实现类去实现Runnable中的抽象方法run
3.创建实现类的对象
4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
5.通过Thread类的对象调用start()
public class MyThreadTest {public static void main(String[] args) {//3.创建该实现类的对象Thread2 thread2 = new Thread2();//4.将该对象作为参数传递到Thread类的构造器中,创建Thread类的对象Thread thread3 = new Thread(thread2);//5.通过Thread类的对象调用start()方法thread3.start();}
}
//1.创建一个实现了Runnable接口的实现类
class Thread2 implements Runnable{//2.重写run()方法@Overridepublic void run() {System.out.println("线程实现方式二:实现Runnable接口方式");}
}
3..线程创建方式三:实现Callable接口
1.创建一个实现Callable的实现类
2.实现call()方法,将此线程需要执行的方法声明在call()中
3.创建callable实现类的对象
4.将此实现类对象作为参数传递到FutureTask构造器中,创建FutureTask对象
5.将FutureTask对象作为参数传递到Thread类中调用start()
6.可以获取Callable中call方法的返回值
class CallableTest implements Callable {@Overridepublic Object call() throws Exception {int sum = 0;for (int i = 0; i <= 100; i++) {if (i % 2 == 0){Thread.sleep(100);System.out.println(Thread.currentThread().getName() + ":" + i);sum += i;}}return sum;}}
public class Demo1 {public static void main(String[] args) {CallableTest c = new CallableTest();FutureTask f = new FutureTask(c);Thread t1 = new Thread(f);Thread t2 = new Thread(f);t1.setName("线程1");t2.setName("线程2");t2.start();t1.start();try {Object sum = f.get();System.out.println(sum);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}
线程的同步
1.同步的方式:方式一:同步代码块
1.同步代码块:实现Runnable的形式
synchronized(同步监视器){需要被同步代码}
2.说明:操作共享数据的代码,即为需要被同步的代码。
3.同步监视器,俗称锁;任何类的对象都可以充当锁;
4.要求:多个线程必须共用同一把锁。
5.在实现Runnable接口创建多线程的方式中,可以考虑使用this作为锁;
6.在继承Thread类创建多线程的方式中,慎用this充当锁,可以使用当前类充当同步监视器
class Window1 implements Runnable{private int ticket = 100;Object obj = new Object();@Overridepublic void run() {while(true){//使用类的对象充当同步监视器
// synchronized(obj){//使用当前类充当同步监视器
// synchronized(Window1.class){//使用this充当同步监视器synchronized(this){if (ticket > 0){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ":购票成功,票号为:" + ticket);ticket--;}else{break;}}}}
}
2.同步的方式二:同步方法:
1.如果操作共享数据的代码完整的声明在一个方法中,我们可以将此方法声明为同步
2.需要将共享数据和同步方法写成静态形式
class Window2 implements Runnable{private static int ticket = 100;@Overridepublic void run() {while(true){getTicket();}}private static synchronized void getTicket(){//默认是一个thisif (ticket > 0){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ":购票成功,票号为:" + ticket);ticket--;}}
3.线程同步的方法三:Lock锁
1.先使用reentrant lock实例化
2.在try中调用锁定方法:lock()
3.在finally中调用解锁方法:unlock()
class Window implements Runnable{private int ticket = 100;ReentrantLock lock = new ReentrantLock();@Overridepublic void run() {while(true){try {lock.lock();if (ticket > 0) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ":购票成功,票号为:" + ticket);ticket--;} else {break;}}finally{lock.unlock();}}}
}
4.案例:三个线程交替打印数组元素
使用三个线程交替打印出数组元素
//实现三个线程交替打印数组元素
public class ThreeThreadPrint {//生成数组元素private static int[] arr = {1,2,3,4,5,6,7,8,9};//记录数组索引private static int currIndex = 0;public static void main(String[] args) {Thread thread1 = new Thread(new ThreadTemp(0));Thread thread2 = new Thread(new ThreadTemp(1));Thread thread3 = new Thread(new ThreadTemp(2));thread1.start();thread2.start();thread3.start();}static class ThreadTemp implements Runnable{//记录线程IDprivate int threadId;public ThreadTemp(int threadId){this.threadId = threadId;}@Overridepublic void run() {synchronized (this) {while(currIndex < arr.length) {if (currIndex % 3 == threadId) {System.out.println("ThreadID:" + threadId + ":" + arr[currIndex]);currIndex++;}}}}}
}
相关文章:
多线程的创建与同步
目录 线程的创建 1.多线程的创建:方式一:继承于Thread类 2.多线程的创建:方式二:实现Runnable 3..线程创建方式三:实现Callable接口 线程的同步 1.同步的方式:方式一:同步代码块 2.…...
LLMs 缩放指令模型Scaling instruct models FLAN(Fine-tuned LAnguage Net,微调语言网络)
本论文介绍了FLAN(Fine-tuned LAnguage Net,微调语言网络),一种指导微调方法,并展示了其应用结果。该研究证明,通过在1836个任务上微调540B PaLM模型,同时整合Chain-of-Thought Reasoning&#…...
政务大厅人员睡岗离岗玩手机识别算法
人员睡岗离岗玩手机识别算法通过pythonyolo系列网络框架算法模型,人员睡岗离岗玩手机识别算法利用图像识别和行为分析,识别出睡岗、离岗和玩手机等不符合规定的行为,并发出告警信号以提醒相关人员。Python是一种由Guido van Rossum开发的通用…...
认识Mybatis的关联关系映射,灵活关联表对象之间的关系
目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…...
如何开发一款唯一艺术平台 区块链 /数字藏品
艺术作品是人类文化的瑰宝,而艺术平台则是连接艺术家与观众的桥梁。如何开发一款独一无二的艺术平台,既要满足专业艺术作品展示的要求,又要提供深度思考的空间,这是我们所面临的挑战。本文将从专业性、思考深度和逻辑性等多个方面…...
【UniApp开发小程序】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】
声明 本文提炼于个人练手项目,其中的实现逻辑不一定标准,实现思路没有参考权威的文档和教程,仅为个人思考得出,因此可能存在较多本人未考虑到的情况和漏洞,因此仅供参考,如果大家觉得有问题,恳…...
运维高级学习--Kubernetes(K8s 1.28.x)部署
一、基础环境配置(所有主机操作) 主机名规划 序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2…...
Apache zookeeper kafka 开启SASL安全认证 —— 筑梦之路
简介 Kafka是一个高吞吐量、分布式的发布-订阅消息系统。Kafka核心模块使用Scala语言开发,支持多语言(如Java、Python、Go等)客户端,它可以水平扩展和具有高吞吐量特性而被广泛使用,并与多类开源分布式处理系统进行集成…...
lintcode 1017 · 相似的RGB颜色【进制计算】
题目链接,题目描述 https://www.lintcode.com/problem/1017 在本题中,每个大写字母代表从“0”到“f”的一些十六进制数字。红绿蓝三元色#AABBCC可以简写为#ABC。 例如,#15c是颜色#1155cc的简写。现在,定义两种颜色#ABCDEF和#UV…...
全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢
展示突破性创新技术,共话行业发展趋势。8月25日,全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下,由浙…...
采用 UML 对软件系统进行建模的基本框架
UML 包括一些可以相互组合为图标的图形元素, 通过提供不同形式的图形来 表述从软件分析开始的软件开发全过程的描述,一个图就是系统架构在某个侧面的 表示,所有的图组成了系统的完整视图。UML 主要提供了以下五类图: ÿ…...
编译tiny4412 Linux 内核
工作环境 Ubuntu 22 交叉编译器 4.5.1 解压Linux内核源码,进入目录 将官方配置完好的defconfig文件作为配置文件 cp tiny4412_linux_defconfig .config由于内核版本较低,需要下载低版本的gcc,选择下载gcc-9与g9 sudo apt install gcc-9 g-…...
Ubuntu22.04安装中文输入法►由踩坑到上岸版◄
Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发:Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统,我还是写一下以便将来用到或参考~ 了解 安装Ubuntu22.04(截至2023年08月26日11ÿ…...
SpringBoot简单上手
spring boot 是spring快速开发脚手架,通过约定大于配置,优化了混乱的依赖管理,和复杂的配置,让我们用java-jar方式,运行启动java web项目 入门案例 创建工程 先创建一个空的工程 创建一个名为demo_project的项目,并且…...
git及GitHub的使用
文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐,现在用起来比较麻烦)ssh连接(推荐)git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注: 下载完…...
【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)
文章目录 引言一、线性方程组的基本概念与表达形式二、线性方程组解的基本定理三、线性方程组解的结构写在最后 引言 继向量的学习后,一鼓作气,把线性方程组也解决了去。O.O 一、线性方程组的基本概念与表达形式 方程组 称为 n n n 元齐次线性方程组…...
使用Python写入数据到Excel:实战指南
在数据科学领域,Excel是一种广泛使用的电子表格工具,可以方便地进行数据管理和分析。然而,当数据规模较大或需要自动化处理时,手动操作Excel可能会变得繁琐。此时,使用Python编写程序将数据写入Excel文件是一个高效且便…...
接口测试总结分享(http与rpc)
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 一、了解一下HTTP与RPC 1. HTTP(H…...
数据结构(Java实现)LinkedList与链表(下)
** ** 结论 让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下: 也…...
linux查看正在运行的nginx在哪个文件夹当中
1、查出Nginx进程PID ps -ef|grep nginx2、查看Nginx进程启动时的工作目录 ls -la /proc/<PID>/cwd将<PID>替换为第一步中列出的Nginx进程的PID。该命令会显示Nginx进程在启动时所在的工作目录(当前工作目录)...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
