多线程并发、线程池、同步方法、同步代码块(锁)

news2024/11/15 11:03:52

多线程:

同时执行多个程序

多线程需要硬件支持(cpu)

并行:在同一时刻,有多个指令在多个cpu上同时执行

并发:在同一时刻,有多个指令在单个cpu上交替执行

进程:正在运行的软件

独立性:

动态性:

并发性:(在交替执行时,有随机性)

线程:是进程种的单个顺序控制流,是一条执行路径

单线程:一个进程只有一条执行路径,称单线程

多线程:一个进程有多条执行路径,称多线程

理解:

进程:可以理解为软件

线程:可以理解为软件里的一个功能

单线程:软件里只运行了一个功能

多线程:软件同时运行了多个功能,即一个进程里有多条线程

 

线程的实现,有3种方式:

优点缺点
Runnable、Callable<>都是接口扩展性强,实现接口的同时还能继承其他类编程复杂,不能直接使用Thread类中的方法
Thread是继承类编程比较简单,可以直接使用Thread类中的方法可扩展性较差,不能继承其他类

三种方式都需要重写run方法,作用是:用来封装被线程执行的代码(可称 线程参数)

在使用上,

1.继承于thread类,直接创建对象,直接启动(xxx.start())线程就可以

2.Runnable的实现类,在创建实现类对象之后,还需要在创建thread类,并且将线程参数传到thread构造方法的参数中。(thread构造参数传递的是Runnable数据类型,后面可以接一个String用来表示此线程的名称,线程名称也可以用thread对象调用setName(String s)方法命名线程 )

3.Callable<E>的实现类,泛型要传入你要返回的值的类型,这个接口的特点就是有返回值,然后还需要创建一个Futurntask<E>(泛型也是返回值类型),然后再将这个对象传入thread参数中。

直接调用run方法和start方法的区别:

run():直接调用相当普通方法调用,按语句顺序执行,并未开启线程

start():启动线程,然后由jvm调用此线程的run()方法,多线程交替执行(多线程并行)

start方法在底层有native修饰的方法,表示与本地操作系统交互的方法

线程的命名:

 

线程有默认名称:格式:Thread-编号

String getName()获取线程名
void setName(String s )

设置线程名

通过Thread带参构造也可以设置线程名

注意:

继承thread的类,在run方法中要在输出语句中使用getName方法,否则打印出不来线程名字

但Runnable和Callable<E>,由于本身缺点无法使用Thread方法

public static Thread currentThread()返回对当前正在执行的线程对象的引用(即获得当前线程的对象)

书写方式:sout( Thread.currentThread().getName()+"@@@"+i);

线程休眠:

public static void sleep(long t)

让线程休眠指定时间,单位为毫秒

(需要自己手动try...catch)

1秒=1000毫秒

注意:

main方法也是线程,称主线程

当一个接口或一个类中没有抛出异常,那么子类或实现类就不能直接抛异常,必须自己try...catch

线程调度:

两种调度模型:

分时调度模型:所有线程轮流使用cpu的使用权,平均分配每个线程占用cpu的时间

抢占式调度模型:优先让优先级高的线程使用cpu,如果先优先级相同,那么会随机选取一个,优先级高的线程获取cpu的时间相对较多(java默认使用)

public final void setPriority(int i)

设置线程优先级

优先级范围:[1,10]

默认是5

public final int getPriority()获取线程的优先级

后台线程/守护线程:

作用:为了守护普通线程而存在的

public final void setDaemon(boolean n)设置为守护线程

当普通线程执行完之后,若守护线程还未执行完就不会再执行了。(但由于普通线程都结束后,守护线程抢到了cpu,由于cpu执行快,守护仍会执行一段时间,不会立即停止)

理解:当关闭聊天窗口时,传输的文件也会被关闭

同步代码块:

锁多条语句操作共享数据,可以使用同步代码块

 

 注意:sleep的try..catch没有了可以合并到下面的catch里,下面的catch将原本Exception改为InterruptedException。这样可以更加简洁

死锁:

注意:Thread里的参数是Runnable接口,此接口只有run抽象方法,可使用lambda表达式

死锁解决方式:以后不要写锁的嵌套

 

多线程书写套路:

1.while(true)

2.syhchronized()锁要唯一

3.判断,共享数据是否结束,结束--break

4.判断,共享数据是否结束,没有结束---执行代码内容 

线程状态:

 

 注意:就绪状态→start方法  这个是准备抢夺cpu执行权的状态,还不是运行状态,只有抢夺到cpu执行权,才可以运行

虚拟机中线程状态,没有运行状态!

Thread类中有个内部类,可以api搜索 Thread.state,可以搜到上面的6种状态

线程池:

作用:创建一个线程池,当线程有空闲的线程(核心线程一直会存在,当其他空闲超出指定时间将自动销毁),则会被使用,当没有空闲线程,则会创建新的线程(线程池有最大线程数,超出则阻塞,即等待)----无需再次创建线程,直接在线程池里拿,提高线程运行效率

创建线程池:

 

ExecutorService s = Executors.newCachedThreadPool();(默认最多可容纳int类型的最大值)

ExecutorService s = Executors.newFixedThreadPool(int i);(创建指定最多可以容纳的线程数量)

s.submit()

参数可以传递Runnable或Callable实现类对象,或lambda表达式。

注意:不能传Thread

submit方法作用是在线程池中创建线程对象,任务执行完毕,也会自动把线程对象归还池子

自己创建一个线程池:

ThreadPoolExecutor

参数一:核心线程数量,线程池执不执行核心线程都会存在,不能小于0

参数二:最大线程数,等于核心线程+临时线程,不能小于等于0,最大数量 >=核心线程数量

参数三:临时线程最大存活时间,不能小于0

参数四:时间单位,用枚举TimeUnit去调用

参数五:任务队列,new ArrayBlockingQueue(int i),默认使用这个,i为排队数量

参数六:创建线程工厂,Executor.defaultThreadFactory(),默认使用这个,按照默认创建线程的                 方式,创建线程对象

参数七:任务的拒绝策略,new ThreadPoolExecutor.AbortPolicy(),有四种拒绝策略,            顶                 discardpolicy策略最好不用

核心线程+临时线程 = 最大线程

最大线程+阻塞线程,超出部分就不要了(具体看处理策略)

 

注意:枚举和泛型不一样

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

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

相关文章

详解VQVAE:Neural Discrete Representation Learning

VQVAE&#xff1a;Neural Discrete Representation Learning 原文链接&#xff1a;https://arxiv.org/abs/1711.00937 要看细节&#xff0c;强推&#xff0c;直接不用看论文了&#xff1a;VQ-VAE的简明介绍&#xff1a;量子化自编码器 - 科学空间|Scientific Spaces 一、问…

车辆管理怎么做?这六个车辆管理系统能帮到你!

通过本篇文章&#xff0c;您将了解以下问题&#xff1a;1、6个车辆管理系统盘点 2、企业使用车辆管理系统的价值是什么&#xff1f; 车辆管理系统指集合处理用车、还车、维保&#xff0c;监测油耗、车辆状态等车辆管理相关工作为一体的系统。 随着车辆数据的不断增长,如何快速…

武汉大学数据科学导论 WHU-data-science-introduction-996station GitHub鉴赏官

推荐理由&#xff1a;武汉大学数据科学导论 数据科学导论 声明: 本仓库构建目的为提供一个开源的可浏览的代码仓库,用于完成本人作业 代码作业的目录如下,纸质作业也已上传,下载地址 采用MIT协议,以供学习交流 第一次作业 决策树 第二次作业 Apriori k-means naive-bayes 第三次…

毕业设计 基于stm32与openmv的目标跟踪系统

文章目录0 前言课题简介设计框架3 硬件设计4 软件设计对被测物体的识别判断被测物体所在区域5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年…

Linux 负载均衡介绍之LVS工作模式-NAT转发模式

Linux 负载均衡介绍之LVS工作模式-NAT转发模式 图示&#xff1a; 工作原理&#xff1a; ①.客户端将请求发往前端的负载均衡器&#xff0c;请求报文源地址是CIP(客户端IP),后面统称为CIP)&#xff0c;目标地址为VIP(负载均衡器前端地址&#xff0c;后面统称为VIP)。 ②.负载…

RK3568平台开发系列讲解(视频篇)视频渲染OpenGL ES是什么

🚀返回专栏总目录 文章目录 一、什么是OpenGL ES二、上下文环境三、OpenGL(ES)的用途四、OpenGL 渲染管线五、创建显卡执行程序5.1、创建 Shader5.2、创建 Program沉淀、分享、成长,让自己和他人都能有所收获!😄 📢渲染并不单单是要把画面绘制到屏幕上,更多的是需要…

VirtualBox启动问题记录

很久之前安装过的虚拟机&#xff0c;虚拟机文件是安装在移动硬盘上的&#xff0c;最近在做redis集群试验的时候&#xff0c;打算重新使用一下这个虚拟机&#xff0c;在启动的时候出现了一些问题&#xff0c;特此记录一下&#xff0c;便于后面再出现此问题时不知所措。 实体机操…

ChatGPT 这玩意也太猛了!程序员朋友们,我在此严正呼吁大家:端好饭碗,谨防 AI!

大家周二好呀。 最近几天大火的 ChatGPT 你玩了吗&#xff1f; 如果你不知道它是个什么东西&#xff0c;那么我让它给你来个自我介绍&#xff1a; ​说白了&#xff0c;就是一个可以对话的人工智能。 我开始以为就是一个升级版的“小爱同学”&#xff0c;“小度小度”&#x…

第一个MyBatis程序

目录 一、新建项目 二、设置数据库和MyBatis的配置 &#x1f351;配置数据库的连接信息 &#x1f351;配置MyBatis XML存放位置和命名规则 三、MyBatis实现查询操作 &#x1f34e;MyBatis的组成 &#x1f34e;使用MyBatis实现查询功能 &#x1f34e;SpringBoot单元测…

TF卡格式化了怎么办?tf卡数据恢复,看这3个方法

现在手机存储卡都很普及&#xff0c;TF卡是最常见的存储卡之一。但是你知道吗&#xff1f;TF卡也会有问题&#xff0c;比如出现误删数据&#xff0c;或者把数据格式化。因为手机内存有限&#xff0c;我们经常会把 TF卡设置为默认的最大空间&#xff0c;这样就可能会出现存储空间…

Java: 字符串indexOf() /substring()/replace() 的使用

需要做的: 获取如下图响应信息html页面中的 fec7f1e4-30e0-41d1-9417-bb4829be51dc 值 一.具体思路&#xff1a; &#xff08;1&#xff09;字符串查找 indexOf()其实就是在字符串中查找其子串第一次出现的位置&#xff0c;如果没有找到该子串&#xff0c;则返回-1 四种用…

三面“有赞”Java岗斩获offer:Spring+JVM+并发锁+分布式+算法

年末离职&#xff0c;年初为面试也筹备挺长一段时间&#xff0c;找了不少复习资料&#xff0c;刷了很多题在网上投了很多简历最终面试了有赞&#xff0c;还有幸拿到offer&#xff01; 本人两年Java开发&#xff0c;本科毕业&#xff0c;计算机专业&#xff0c;勤学好问、积极上…

BM(Boyer-Moore) 算法详解

BM算法(Boyer-Moore) BM算法也叫做精确字符集算法&#xff0c;它是一种从右往左比较&#xff08;后往前&#xff09;&#xff0c;同时也应用到了两种规则坏字符、好后缀规则去计算我们移动的偏移量的算法。 坏字符规则 BM 算法是从后往前进行比较&#xff0c;此时我们发现比…

ArcGIS基础:不同方法修改栅格数据像元值

【1】&#xff1a;根据值修改栅格值 原始数据如下所示&#xff1a; 是一个栅格数据&#xff0c;分为三种不同的颜色&#xff0c;三种颜色代表三个不同的数值&#xff0c;如下所示&#xff1a; 如下所示&#xff0c;为1、2、3三个不同值。 下面将栅格值为1 的数据的数值替换…

5年测试,面试结束后被HR怼了..(心塞)

前一阵子向朋友诉苦&#xff0c;我在参加字节跳动面试的时候被面试官怼得哑口无言&#xff0c;场面让我一度十分尴尬。印象最深的就是下面几个问题&#xff1a; 根据你以前的工作经验和学习到的测试技术&#xff0c;说说你对质量保证的理解&#xff1f;非关系型数据库和关系型数…

【免杀前置课——Windows编程】十五、网络编程——C/S,B/S模式分别是什么?WinSocket、Socket传输的定义和其特点、实现简易通信(附代码)

网络编程网络编程C/S:客户端/服务器模式:B/S:浏览器/服务器架构模式。WinSocket:Socket传输的定义和其特点实现简易通信服务器端客户端网络编程 网络分为C/S,B/S两种模式。 C/S:客户端/服务器模式: 服务器端&#xff1a; 首先服务器先启动&#xff0c;并根据客户端请求做出相…

Pytest 的高级用法之插件开发

用过pytest的小伙伴应该都知道&#xff0c;pytest之所以功能强大&#xff0c;是因为pytest的插件非常的多。这是插件大多是pytest的使用者所开发的&#xff0c;今天咱们专门来聊聊如何去自己开发Pytest的插件。 一 pytest插件的介绍 pytest框架采用的是插件系统的模式来设计的…

安装VMware

大纲&#xff1a; 一、VMware简介 VMWare虚拟机软件是一个“虚拟PC”软件&#xff0c;它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。 二、VMware摘要笔记 三、VMware安装步骤 1、将VMware Workstation 16 Pro解压后 双击运行第二个应用程序(player)进行…

精品基于springboot的线上跳蚤市场平台

《线上跳蚤市场平台》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;springboot(ssm) 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&a…

Android 中的权限

1、权限类型 Android 将权限分为不同的类型&#xff0c;包括安装时权限、运行时权限和特殊权限。每种权限类型都指明了当系统授予应用该权限后&#xff0c;应用可以访问的受限数据范围以及应用可以执行的受限操作范围。每项权限的保护级别取决于其类型。 1.1、安装时权限 安…