回炉重造java----多线程

概念

883e32949e1443fc9a70ccac0fd670d3.jpg

注: main方法其实也是一个线程。在java中所以的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集(gc )线程

线程的创建

74d09aa44b0943abaae52fe7ad8d4364.jpg

第一种:继承Thread类,重写run方法(其底层也是实现了Ruunable接口)

20fd67ff441e4316b6dac3aea432234e.jpg

faed3d395f61438784314047dcbdcf81.jpg

第二种:实现Runnable接口,重写run方法(启动线程时要把对象丢进Thread对象中)

56bd891d2612485eb6b75d528515cab9.jpg

d2cf1ecc79bd473f99dfcd1ef64ad70d.jpg


两种方式的总结:

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类

第三种:实现Callable接口(了解)

bcc9a4a6960d4f419b02cfe07919aac5.jpg

线程属性

 ①线程ID,标识线程

 ②线程名字    ③线程优先级(1-10),优先级越高越优先执行,但并不成正比关系

④线程状态,NEW   RUNNALBE  BLOCKED  WAITING  TERMINATED

⑤线程类别,ture标识守护线程(后台记录操作日志,监控内存,垃圾回收),false标识用户线程。虚拟机必须保证用户线程的执行完毕,不用等待守护线程执行

线程状态

b8be8c213f2f487d9afba094b5aa163e.jpg

线程休眠sleep():

①参数为阻塞线程的毫秒数

②阻塞时间到了之后线程进入就绪状态

③每个对象都有一把锁,sleep不会释放锁

等待线程停止join():

①相当于插队,在主线程中是子线程join(),即主线程等待子线程执行完毕再执行

线程礼让yield():

①礼让的意思是停止cpu对该进程的执行,即从运行状态变成就绪状态

②礼让不一定成功,得看cpu的调度

线程停止:

①使其自动运行完然后停止

②可以设置一个标志位flag来停止线程

③不要使用stop()和destory()等过时或者JDK不建议的方法去停止线程

线程同步(并发)

package Algorithm.SYN;public class UnsafeThread {public static void main(String[] args) {Buytciket buytciket = new Buytciket();new Thread(buytciket,"1号").start();new Thread(buytciket,"2号").start();new Thread(buytciket,"3号").start();}}class Buytciket implements Runnable{//定义总数量private int TicketNum = 10;boolean flag = true;@Overridepublic void run() {//买票while (flag){try {buy();} catch (InterruptedException e) {e.printStackTrace();}}}private void buy() throws InterruptedException {//判断是否有票if(TicketNum <= 0){flag = false;return;}//模拟延时Thread.sleep(100);//买票System.out.println(Thread.currentThread().getName()+"买到了第"+TicketNum--+"票");}
}

可见出现了线程的并发问题。

 锁机制(synchronized):

synchronized锁又可以分为synchronized方法和synchronized块:其默认锁的是this,即对象本身。synchronized块锁的是变化的量(对象)。

    //synchronized同步方法private synchronized void buy() throws InterruptedException {//判断是否有票if(TicketNum <= 0){flag = false;return;}//买票System.out.println(Thread.currentThread().getName()+"买到了第"+TicketNum--+"票");}

 拓展:JUC包下的安全集合CopyOnWriteArrayList,可以实现线程集合安全

 

死锁

 private void mu() throws InterruptedException {if(choice == 0){//获得口红synchronized (lipstick){System.out.println(this.name+"获得口红");Thread.sleep(1000);synchronized (m){System.out.println(this.name+"获得镜子");}}}else{//获得口红synchronized (m){System.out.println(this.name+"获得镜子");Thread.sleep(2000);synchronized (lipstick){System.out.println(this.name+"获得口红");}}}

发生死锁!!进程全部阻塞 

private void mu() throws InterruptedException {if(choice == 0){//获得口红synchronized (lipstick){System.out.println(this.name+"获得口红");Thread.sleep(1000);}synchronized (m){System.out.println(this.name+"获得镜子");}}else{//获得口红synchronized (m){System.out.println(this.name+"获得镜子");Thread.sleep(2000);}synchronized (lipstick){System.out.println(this.name+"获得口红");}}

产生死锁的条件:

 

 Lock锁(显式)

 两种锁的对比:

 

 

 线程池

public class pool {public static void main(String[] args) {//创建线程池ExecutorService service = Executors.newFixedThreadPool(10);//线程池大小//执行service.execute(new my());service.execute(new my());service.execute(new my());service.execute(new my());//关闭连接service.shutdown();}
}class my implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}
}

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

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

相关文章

【Ubuntu】apt命令安装最新版本Nginx

目录 环境前言添加Nginx仓库步骤1、仓库公钥2、文本公钥转二进制GPG公钥&#xff08;可选&#xff09;3、添加apt软件源4、安装新版Nginx 参阅 环境 Ubuntu 22.04 前言 ubuntu官方apt软件仓库&#xff08;或者叫软件源&#xff09;的软件版本可能会比较旧&#xff0c;导致无…

AI算法-高数5-线性代数1-基本概念、向量

线性代数&#xff1a;主要研究1、张量>CV计算机视觉 2、研究张量的线性关系。 深度学习的表现之所以能够超过传统的机器学习算法离不开神经网络&#xff0c;然而神经网络最基本的数据结构就是向量和矩阵&#xff0c;神经网络的输入是向量&#xff0c;然后通过每个矩阵对向量…

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint&#xff1f;2. 为什么要使用 Flask Blueprint&#xff1f;3. 如何使用 Flask Blueprint&#xff1f;4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时&#xff0c;保持代码的组织结构清晰…

遨游 JavaScript 对象星际:探索面向对象编程的深邃世界

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f4af;面向对象编程&#x1f517;1 什么是对象&#x1f517;2 什么是…

免费SSL证书申请安装通用指南

JoySSL官网 注册码230918 关于SSL证书的申请与安装&#xff0c;以下是一个概括性的技术性指南&#xff0c;适合那些希望详细了解该过程的技术人员或网站管理员。请注意&#xff0c;具体步骤可能会根据证书颁发机构(CA)和服务提供商的不同而有所变化。 一、选择SSL证书类型与颁…

Postman工具介绍与安装

一、Postman介绍 Postman 乃是一款对 HTTP 协议予以支持的接口调试及测试工具&#xff0c;其突出特性在于功能强大&#xff0c;并且使用简便、易用性良好。不管是开发人员开展接口调试工作&#xff0c;还是测试人员进行接口测试任务&#xff0c;Postman 均属于首选工具之一。 接…

使用Python递归重命名文件和文件夹

使用 Python 递归重命名文件和文件夹可以通过 os 模块和 os.path 模块来完成。下面是一个示例代码&#xff0c;演示如何递归地重命名文件和文件夹&#xff1a; 1、问题背景 在研究大型数字档案时&#xff0c;需要将这些档案复制到本地存储进行保存。这些档案通常存储在 USB 驱…

吴恩达机器学习笔记:第 10 周-17大规模机器学习(Large Scale Machine Learning)17.3-17.4

目录 第 10 周 17、 大规模机器学习(Large Scale Machine Learning)17.3 小批量梯度下降17.4 随机梯度下降收敛 第 10 周 17、 大规模机器学习(Large Scale Machine Learning) 17.3 小批量梯度下降 小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法&am…

SpringBoot自动配置源码解析+自定义Spring Boot Starter

SpringBootApplication Spring Boot应用标注 SpringBootApplication 注解的类说明该类是Spring Boot 的主配置类&#xff0c;需要运行该类的main方法进行启动 Spring Boot 应用 SpringBootConfiguration 该注解标注表示标注的类是个配置类 EnableAutoConfiguration 直译&#…

沃尔玛自养号测评的优势是什么?有哪些技术要求

沃尔玛自养号测评的优势主要体现在以下几个方面&#xff1a; 1. 可控性强&#xff1a;自养号测评允许卖家完全掌控测评流程&#xff0c;包括账号的创建、管理、使用等&#xff0c;可以根据需要随时调整指定测评周期&#xff0c;确保测评效果最大化。 2. 安全性高&#xff1a;…

ae如何导出mp4格式?图文教程,手把手教您搞定

在创作精彩的视频内容后&#xff0c;将其成功导出为通用的MP4格式是确保作品在不同平台上流畅播放的重要一环。Adobe After Effects作为一款专业的视频后期制作工具&#xff0c;提供了丰富的功能来实现这一目标。在本文中&#xff0c;我们将通过图文教程&#xff0c;手把手地向…

牛客 二叉树 NB20 翻转牛群结构

[原题连接](翻转牛群结构_牛客题霸_牛客网 (nowcoder.com)) 这道题简单来讲就是给着棵树翻个面, 翻面后各个节点之间不会有子节点的交换, 但是每个节点的左右节点会做交换, 所以我们采用层序遍历来遍历二叉树, 在遍历的过程中交换每个节点的左右节点即可 public class Solutio…

Linux禁用危险命令和防止误操作

禁用rm命令 编辑/etc/profile文件&#xff0c;结尾添加 ###### rm prevent ###### alias rmecho can not use rm command使用source命令生效 source /etc/profile效果 使用mv命令代替rm命令 将需要删除的文件移动到特定的目录&#xff0c;比如/home/sharedir/ 在.bashrc目…

臻奶惠:社区牛奶直供领航者

在当今中国经济转型升级的紧要关头&#xff0c;随着人口红利的逐步减弱&#xff0c;消费升级趋势日益显著&#xff0c;传统行业面临着前所未有的变革与重组。在此背景下&#xff0c;臻奶惠凭借其独到的市场洞察力和前瞻的战略布局&#xff0c;聚焦于健康消费的新蓝海&#xff0…

spring cloud alibaba、spring cloud和springboot三者的版本兼容

官方版本说明地址: 版本说明 alibaba/spring-cloud-alibaba Wiki GitHub 组件版本关系 每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示(注意,Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进): Spring Cloud Alibaba Ve…

Multsim仿真电路:(十七)DC-DC降压电路原理简单仿真

1.前言 由于日常工作中&#xff0c;降压电路用的比较多&#xff0c;所以我只对降压DC-DC进行仿真&#xff0c;本质上还是自己学习记录&#xff0c;因为发现越深入要了解的东西就会越多&#xff0c;慢慢就脱离我现在使用的范畴&#xff0c;就又会变成空空的学习&#xff0c;所以…

社交媒体数据恢复:密聊猫

一、概述 密聊猫是一款提供多种优质体验的手机社交聊天软件。通过这款软件&#xff0c;用户可以享受到多种不同的乐趣体验&#xff0c;如真人在线匹配、真实的交友体验等。同时&#xff0c;密聊猫也提供了数据恢复功能&#xff0c;帮助用户找回丢失的数据。 二、数据恢复步骤…

黑马甄选离线数仓项目day01(项目介绍)

课程介绍 项目名称 黑马甄选数仓形式 离线数仓开发业务类型 电商业务 电商介绍 B2B B2C C2C 项目属于 新零售电商 新零售 线上(网站,app,小程序&#xff09; 线下&#xff08;实体体验店&#xff09; 物流&#xff08;自营物流&#xff09; 项目行业 果蔬生鲜领域 商业模式 B…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《规模化屋顶光伏接入配电网的建设决策》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

数据结构---经典链表OJ

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…