线程(Thread)

目录

线程(Thread)

线程的创建方式 实现方式

Runnable和Callable的区别

线程的命名和优先级

线程的六种状态

线程的插队

线程的中断

线程的让出

守护线程

设置线程为守护线程

sleep()和wait()的区别

线程的同步synchronized锁

语法格式

实现原理

锁升级(锁优化、所膨胀)

线程安全的案例

ReentrantLock锁

并发集合

CopyOnWriteArrayList

思想

并发修改时保证线程安全

并发读取

CopyOnWriteArraySet

BlockingQueue阻塞队列

ArrayBlockingQueue:有界队列

LinkedBlockingQueue:无界队列

ConcurrentHashMap

线程池

常用方法

执行流程

配置参数

拒绝策略

常用线程池


线程(Thread)

线程的创建方式 实现方式

创建方式只有一种:通过Thread创建

实现方式有四种分别是:

  1. 继承Thread类实现

  2. 传入Runnable接口实现类实现

  3. 传入Callable接口实现类实现(要用FutureTask转化为runnable)

  4. 通过线程池实现

Runnable和Callable的区别

  1. runnable接口中的run()方法没有返回值,callable接口中的call()方法有返回值

  2. callable接口实现类中的run方法允许异常向上抛出,可以在内部处理,runnable接口实现类中run方法的异常必须在内部处理,不能向上抛出。

线程的命名和优先级

命名

  1. 在实例化Thread时传入线程名

  2. setName()方法设置线程名

优先级:setPriority()方法设置,(最大10,最小1,默认5)

线程的六种状态

线程创建后为new状态,start()启动后进入runnable可运行状态,run()方法执行结束后进入terminated终止状态,runnable有三个分支状态,当多个线程竞争时,没有获取到锁的线程进入blocked阻塞状态。调用Object.wait()方法和Thread.join()方法后会进入waiting等待状态,调用notify()方法唤醒线程重新进入runnable状态。调用Thread.join(时间值)、Object.wait(时间值)、Thread.sleep(时间值)等方法进入timed_waiting计时,等待状态时间结束后恢复runnable可运行状态。

线程的插队

调用 join() 方法实现插队。

底层通过调用Object的wait方法实现,因为线程在die的时候会自动调用自身的notifyAll方法,来释放所有的资源和锁。

线程的中断

interrupt()

修改中断状态为true,抛出InterruptedException,执行结束。

线程的让出

yield() 让出一次

守护线程

设置线程为守护线程

通过 setDaemon(true) 方法设置

守护线程是用来为用户线程服务的,当一个程序中的所有用户线程都结束之后,无论守护线程是否在工作都会跟随用户线程一起结束。

sleep()和wait()的区别

  1. 休眠过程中,当前线程不会让出持有的"锁",等待过程中,当前线程会让出持有的"锁"

线程的同步synchronized锁

线程安全问题:多个线程同时访问竞争一个资源时,会导致数据损坏不一致。

保证一段代码的原子性就是通过加锁和解锁实现的,实现线程的同步安全,参数对象一致则使用同一个锁。

            synchronized (mutex) {Counter.count-=1;}

synchronized是一个关键字

语法格式

代码块:自定义对象作为锁

普通方法前:this,代表调用该方法的对象

静态方法前:该静态类Class对象

实现原理

1.通过Monitorenter和Monitorexit两个指令实现

2.通过monitor监视器机制实现线程同步

WaitSet:线程等待区

EntryList:线程阻塞区

Owner:线程拥有者

锁升级(锁优化、所膨胀)

在JDK1.6之前,synchronized性能开销较大;在JDK1.6之后,对synchronized进行了优化,它会自动根据程序的执行情况,自动进行锁的升级:偏向锁->轻量级锁->重量级锁

偏向锁(偏斜锁):只有一个线程访问时,使用偏向锁,通过Owner记录线程ID实现

轻量级锁:出现多个线程访问时(没有并发),使用轻量级锁,通过CAS实现

重量级锁:出现多个线程并发访问时,使用重量级锁。由于重量级锁,使用操作系统的互斥锁实现。(使用互斥锁,从“用户态”切换至“内核态”,带来性能开销,所以性能相对较差)

线程安全的案例

可变字符串的线程安全: StringBuffer : 线程安全(在改变字符串内容的方法上使用synchronized同步锁),性能较差

StringBuilder:线程不安全,性能较好

集合类的线程安全(使用synchronized关键字实现线程安全)

List接口的线程安全实现类:Vector,Stack

Map接口的线程安全实现类:Hashtable

ReentrantLock锁

1.ReentrantLock是核心类库提供的锁实现类,实现了Lock接口,通过lock()方法加锁,unlock()方法释放锁。

2.通过trylock()方法支持获取锁的尝试机制

3.支持公平锁和非公平锁,内部通过AQS机制实现

ReentrantLock实现线程安全的案例

CopyOnWriteArrayList

ArrayBlockingQueue

并发集合

List Set Map Queue

CopyOnWriteArrayList

思想

修改时将原数组内容复制Copy到新数组内,在新数组内修改,然后替换

并发修改时保证线程安全

通过ReentrantLock实现多个线程并发修改时的线程安全同步(添加元素的同时,不允许删除)

添加新元素:list.add("")

按照指定下标替换元素:list.set(index, element)

按照指定下标删除元素:list.remove(0)

并发读取

没有加锁,允许多个线程同时并发读取;但是读取时,可能产生脏读(读取的同时,允许写入操作)。

CopyOnWriteArraySet

内部通过一个CopyOnWriteArrayList实现

BlockingQueue阻塞队列

阻塞队列:有两个线程,分别进行读写(task和put)操作;读取时,不允许写入,如果队列为空,则读取线程阻塞;写入时,不允许读取,如果队列已满,则写入线程阻塞;

经常用于生产消费场景

ArrayBlockingQueue:有界队列

LinkedBlockingQueue:无界队列

ConcurrentHashMap

JDK1,7:通过分段锁实现线程安全

JDK1,8:通过 synchronized+CAS实现线程安全

当产生哈希冲突时,通过synchronized将根节点作为锁,进行线程的同步安全

在没有产生哈希冲突时,通过CAS进行无锁化操作,降低synchronized进行线程同步操作所引发的性能下降

线程池

常用类和接口

ExecutorService接口:线程池的操作

Executors类:工具类,提供了常见线程池的封装

ThreadPoolExecutor类:具体线程池实现类

常用方法

void execute(Runnable command):提交线程任务

Future<T> submit(Callable<T> task):提交线程任务,可以获取线程执行结果

void shutdown():将线程池中的线程任务执行完毕后,关闭线程池

List<Runnable> shutdownNow():立刻关闭线程池,并返回未完成的线程任务

执行流程

  1. 提交线程任务,分配空闲线程

  2. 判断“工作线程数”是否超出“核心线程数”,如果未超出,则创建新线程;

  3. 如果超出,将线程任务存入工作队列

  4. 如果工作队列已满,判断判断“工作线程数”是否超出“最大线程数”,如果未超出,则创建新线程

  5. 如果超出,则执行拒绝策略

配置参数

核心线程数

最大线程数

线程存活时间

工作队列

线程工厂

拒绝策略

AbortPolicy(默认拒绝策略):丢弃当前线程任务,并抛出RejectedExecutionException

AbortPolicy:丢弃当前线程任务

DiscardOldestPolicy:丢弃工作队列中最早入队的线程任务

CallerRunsPolicy:由当前调用线程处理执行线程任务

常用线程池

Executors.newFixedThreadPool(3):固定数目的线程池

Executors.newCachedThreadPool():动态数目的线程池(线程被缓存,提供重复使用效率)

Executors.newSingleThreadExecutor():仅包含1个线程的线程池(将大量的线程任务保存至工作队列,然后按照提交顺序,用一条线程依次处理)

Executors.newScheduledThreadPool(5):可以按照时间进行调度执行任务的线程池

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

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

相关文章

使用kubeadm部署k8s集群

1、简介 K8s部署主要有两种方式&#xff1a; 1、Kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 2、二进制 从github下载发行版的二进制包&#xff0c;手动部署每个组件&#xff0c;组成Kubernetes集…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署WordPress网站

828华为云征文&#xff5c;华为云Flexus云服务器X实例之openEuler系统下部署wordpress网站 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、WordPress介绍2.1 WordPress简介2.2 WordPress主要特点…

有什么免费好用的ai写作软件?2024帮助你快速进行写作的软件

有什么免费好用的ai写作软件&#xff1f;2024帮助你快速进行写作的软件 AI写作软件如今在提升写作效率、生成灵感、以及帮助完成复杂的写作任务方面表现得越来越出色。以下是五款免费且好用的AI写作软件&#xff0c;它们能够帮助你快速进行写作&#xff0c;无论是博客文章、市…

面试官:为什么 Redis 6.0 之后引入多线程?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 回答 Redis 的性能瓶颈从来都不是 CPU&#xff0c;是网络I/O 和内存。 内存好解决&#xff0c;加机器内存和优化数据结构。 网路 I/O 的优化才是大头&#xff0c;因为读写网络的 read…

U盘格式化怎么办?这4款软件可以帮你进行数据恢复。

如果你的U 盘被格式化&#xff0c;里面的数据就会被清除掉了。有备份的话&#xff0c;就不用担心丢失那些重要的数据&#xff1b;如果没有备份&#xff0c;也有办法解决&#xff1b;可以用电脑自带的一些功能恢复&#xff0c;或者是使用专业的恢复软件。如果大家有需求&#xf…

【MTC拾取放置示例】将Connect中的最大目标偏差检查增加到1e-2,实现move to pick/move to place

问题描述 在运行Moveit2使用MTC构建拾取放置示例Pick and Place with MoveIt Task Constructor的时候出现报错 move to pick规划失败 “The computed trajectory is too short to detect jumps in joint-space. Need at least 10 steps, only got 2. Try a lower max_step”…

自带线充电宝哪个牌子质量好性价比高?口碑最好自带线充电宝

在如今这个快节奏的时代&#xff0c;手机等电子设备已经成为我们生活中不可或缺的一部分。然而&#xff0c;电量不足的困扰时常让我们陷入尴尬境地。自带线充电宝的出现&#xff0c;无疑为我们解决了这一难题。它不仅方便携带&#xff0c;无需再额外携带充电线&#xff0c;而且…

iphone16-iphone16pro原壁纸分享

iphone16-iphone16pro原壁纸分享 苹果公司在2024年9月10日的秋季新品发布会上正式推出了iPhone 16系列智能手机。以下是iPhone 16系列的主要特点和更新&#xff1a; 全新A18芯片&#xff1a;iPhone 16系列搭载了苹果最新的A18芯片&#xff0c;这款芯片专为苹果智能&#xff08;…

2024年CCPC网络赛K题题解 —— 取沙子游戏(gym105336K)

比较新的一类博弈题&#xff0c;考虑对因子的处理。题面&#xff1a; 在网络赛以前&#xff0c;我曾经做到过一道类似的题目&#xff1a; Bob和Alice和两堆石头&#xff0c;一堆有s1个&#xff0c;另一堆有s2个&#xff0c;然后Alice先手&#xff0c;每个人每次可以选择一堆石头…

【NVMe SSD寄存器、数据结构】NVMe Controller 重要寄存器、SSD内部跟NVMe相关的重要数据结构解析

前言 NVMe Controller会将一些重要的信息&#xff08;NVMe控制器的能力&#xff0c;状态&#xff0c;Admin SQ, CQ地址等&#xff09;直接放在NVMe寄存器中&#xff0c;另一部分&#xff08;跟SSD比较相关的&#xff09;信息会放置在SSD内部&#xff0c;并最终通过Admin NVMe …

UML的图及其他图补充

一、UML图 1.类图 ‌类图‌是统一建模语言&#xff08;UML&#xff09;中的一种静态结构图&#xff0c;主要用于描述软件系统的静态结构。它显示了模型中的类、类的内部结构以及它们与其他类的关系。类图是面向对象建模的主要组成部分&#xff0c;用于对系统的词汇进行建模、对…

C++day7

一、思维导图 二、模板类实现myStack和myQueue #include <iostream>using namespace std;template <typename T> class MyStack { private:T* arr;int capacity;int topIndex;public:MyStack(int size);~MyStack();void push(const T& value);void pop();T to…

无线通信 | 射频校准的概念、作用和步骤以及相关仪器

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、射频校准 1、射频校…

面向物联网基础的智能农业环境的节能边缘-雾-云计算架构

这篇论文的标题是《Energy-Efficient Edge-Fog-Cloud Architecture for IoT-Based Smart Agriculture Environment》&#xff0c;作者是Hatem A. Alharbi和Mohammad Aldossary&#xff0c;发表在IEEE Access期刊上。论文的主要内容可以概括为以下几个部分&#xff1a; 摘要&am…

戏曲文化苑管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;操作日志管理&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;戏曲管理&#xff0c;用户管理&#xff0c;轮播图信息 微信端账号功能包括&#xff1a;系统首页&#…

vue 使用vue-quill-editor 富文本添加源码模式,查看源码功能和表格功能

今天接到个需求&#xff0c;在富文本中增加查看源码和增加表格功能&#xff0c;感觉这种功能手拿把掐&#xff0c;但是奈于平时沉迷于移动端有段时间没写pc了&#xff0c;看了下官方感觉一个头两个大&#xff0c;于是在茫茫文档中各种借鉴&#xff08;抄袭&#xff09;完成了功…

口袋微店多店铺管理解决方案:甜羊浏览器的应用

#### 前言 随着移动互联网的快速发展&#xff0c;口袋微店成为了众多商家首选的在线销售平台。然而&#xff0c;对于拥有多个口袋微店店铺的商家而言&#xff0c;如何高效地管理这些店铺成为了一大挑战。为了帮助商家解决这一难题&#xff0c;我们推荐使用甜羊浏览器&#xff…

局域网一套键鼠控制两台电脑(台式机和笔记本)

服务端&#xff08;有键盘和鼠标的电脑作为服务端&#xff09; 下载软件 分享文件&#xff1a;BarrierSetup-2.3.3.exe 链接&#xff1a;https://pan.xunlei.com/s/VO66rAZkzxTxVm-0QRCJ33mMA1?pwd4jde# 配置服务端 一&#xff0c; 二&#xff0c; 客户端屏幕名称一定要和…

携手浙商证券、华锐技术,共话交易技术的创新与应用

秉承“虚已者进德之基&#xff0c;求同存异谓之共赢”的理念&#xff0c;浙商证券联合非凸科技、华锐技术于8月28日在深圳举办了“量化机遇汇浙&#xff0c;交易技术共商”鑫管家私募沙龙纷享会。此次活动汇聚了众多优秀管理人与资方代表&#xff0c;分享前沿观点&#xff0c;探…

机器学习-逻辑回归原理及其公式

逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类任务的统计学方法&#xff0c;尤其是在二分类问题中表现尤为突出。尽管它的名字中包含“回归”&#xff0c;但实际上逻辑回归是一种分类算法。逻辑回归的目标是预测一个样本属于某一类别的概率&#x…