java多线程下

news2024/11/25 14:26:37

ThreadLocal

ThreadLocal 有什么用?通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢?JDK 中自带的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的由来。他们可以使用 get() 和 set() 方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。
再举个简单的例子:两个人去宝屋收集宝物,这两个共用一个袋子的话肯定会产生争执,但是给他们两个人每个人分配一个袋子的话就不会出现这样的问题。如果把这两个人比作线程的话,那么 ThreadLocal 就是用来避免这两个线程竞争的。

线程池

池化技术想必大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种限制和管理资源(包括执行一个任务)的方式。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。

使用线程池的好处:

降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

如何创建线程池?

方式一:通过ThreadPoolExecutor构造函数来创建(推荐)。

线程池常见的参数有哪些

ThreadPoolExecutor 3 个最重要的参数:
corePoolSize : 任务队列未达到队列容量时,最大可以同时运行的线程数量。
maximumPoolSize : 任务队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。
workQueue: 新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。ThreadPoolExecutor其他常见参数 :
keepAliveTime:线程池中的线程数量大于 corePoolSize 的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了 keepAliveTime才会被回收销毁;
unit : keepAliveTime 参数的时间单位。
threadFactory :executor 创建新线程的时候会用到。
handler :饱和策略。关于饱和策略下面单独介绍一下。

线程池处理任务的流程

在这里插入图片描述
如果当前运行的线程数小于核心线程数,那么就会新建一个线程来执行任务。如果当前运行的线程数等于或大于核心线程数,但是小于最大线程数,那么就把该任务放入到任务队列里等待执行。如果向任务队列投放任务失败(任务队列已经满了),但是当前运行的线程数是小于最大线程数的,就新建一个线程来执行任务。如果当前运行的线程数已经等同于最大线程数了,新建线程将会使当前运行的线程超出最大线程数,那么当前任务会被拒绝,饱和策略会调用RejectedExecutionHandler.rejectedExecution()方法。# 如何给线程池命名?

Future

Future 类是异步思想的典型运用,主要用在一些需要执行耗时任务的场景,避免程序一直原地等待耗时任务执行完成,执行效率太低。具体来说是这样的:当我们执行某一耗时的任务时,可以将这个耗时任务交给一个子线程去异步执行,同时我们可以干点其他事情,不用傻傻等待耗时任务执行完成。等我们的事情干完后,我们再通过 Future 类获取到耗时任务的执行结果。这样一来,程序的执行效率就明显提高了。这其实就是多线程中经典的 Future 模式,你可以将其看作是一种设计模式,核心思想是异步调用,主要用在多线程领域,并非 Java 语言独有。
在 Java 中,Future 类只是一个泛型接口,位于 java.util.concurrent 包下,其中定义了 5 个方法,主要包括下面这 4 个功能:
取消任务;
判断任务是否被取消;
判断任务是否已经执行完成;
获取任务执行结果。

AQS

AQS 的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。

AQS 的原理是什么?

AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
CLH(Craig,Landin,and Hagersten) 队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS 是将每条请求共享资源的线程封装成一个 CLH 锁队列的一个结点(Node)来实现锁的分配。在 CLH 同步队列中,一个节点表示一个线程,它保存着线程的引用(thread)、 当前节点在队列中的状态(waitStatus)、前驱节点(prev)、后继节点(next)。
在这里插入图片描述

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

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

相关文章

解释表情包This code will never do anything!

目录 解释一下下面这段代码 #include int main(){ while (1) ;} void unreachable(){ std::cout <<"Hello world!"<;}<> 解释一下下面这段代码 $ clang loop.cpp -01 -Wall -o loop $ ./loop Hello world! 解释一下下面这段代码 #include <iostre…

python面试题

文章目录 赋值、深拷贝和浅拷贝有什么区别&#xff1f;元组和列表有什么不同&#xff1f;和is有什么不同&#xff1f;集合怎么转字典&#xff1f;字典怎么遍历&#xff1f;如何在Python中实现多线程&#xff1f;如何实现tuple和list的转换&#xff1f;实现删除一个list里面的重…

厉害的人是搭建平台的人,少数人

牛人是搭建平台的人&#xff0c;是少数人 创建平台才有难度 趣讲大白话&#xff1a;多数人的成就是借平台之力 【趣讲信息科技157期】 **************************** 认识清楚平台能力和个人能力 创建阿里巴巴公司太难 多数人是借阿里巴巴平台之力成就的 离开一个成功的平台&a…

汽车之家股票回购速度远低于预期,面临严重的资本投资风险

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 汽车之家的估值 基于对汽车之家&#xff08;ATHM&#xff09;2023财年非GAAP调整后每股收益2.55美元的普遍预测&#xff0c;市场给予汽车之家目前的估值约为2023财年预期正常化市盈率的13倍&#xff0c;猛兽财经认为这个市…

libevent高并发网络编程 - 01_libevent事件Event处理

文章目录 1. libevent事件驱动和事件处理简介2. 事件状态分析3. 事件Event常用API3.1 event_base_new()3.2 event_base_free()3.3 event_new()3.4 event_add()3.5 event_del()3.6 event_free()3.7 event_base_dispatch()3.8 event_base_loopbreak()3.9 evsignal_new()3.10 even…

继承与虚函数练习

Tip1 基类私有成员变量在子类中都不能直接访问&#xff0c;不是因为没有被子类继承&#xff0c;而是权限问题 Tip2 满足多态的父子对象&#xff0c;父类对象和子类对象前4个字节都是虚表指针&#xff08;vs2019下&#xff09;&#xff0c;父类与子类指向的是各自的虚表。 Tip…

云计算中的容器技术及其实践案例

第一章&#xff1a;什么是容器技术 随着云计算和DevOps的普及&#xff0c;容器技术在IT行业中越来越受到关注。容器是一种轻量级、可移植、可扩展的应用程序封装技术&#xff0c;可以将应用程序及其所有依赖项打包到一个独立的可执行文件中。相对于虚拟机技术&#xff0c;容器技…

无界AI绘画基础教程,和Midjourney以及Stable Diffusion哪个更好用?

本教程收集于&#xff1a;AIGC从入门到精通教程汇总 简单的总结 Midjourney&#xff0c;Stable Diffusion&#xff0c;无界AI的区别&#xff1f; Midjourney&#xff0c;收费&#xff0c;上手容易&#xff0c;做出来高精度的图需要自己掌握好咒语。咒语写不好&#xff0c;像…

【LLM大模型】LLM模型指令微调(更新中)

note 文章目录 note零、AIGC生成式模型1. 核心要素2. LLM evolutionary tree 二、LLM大模型1. ChatGLM&#xff08;1&#xff09;GLM-130B&#xff08;2&#xff09;ChatGLM-6B 2. LLaMA3. Chinese-LLaMA-Alpace4. Bloom5. PaLM 三、模型指令微调Reference 零、AIGC生成式模型 …

算法记录 | Day53 动态规划

1143.最长公共子序列 思路&#xff1a; 本题和动态规划&#xff1a;718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了&#xff0c;但要有相对顺序&#xff0c;即&#xff1a;“ace” 是 “abcde” 的子序列&#xff0c;但 “aec” 不是 “abcde” 的子序…

搭建DHCP、PXE、DNS、HTTP以及NFS服务综合实验的超详细讲解

文章目录 1.实验要求2.实验步骤2.1 步骤解答问题&#xff08;1&#xff09;2.1 步骤解答问题&#xff08;2&#xff09;2.1 步骤解答问题&#xff08;3&#xff09;2.1 步骤解答问题&#xff08;4&#xff09;2.1 步骤解答问题&#xff08;5&#xff09; 1.实验要求 &#xff…

Hadoop入门篇01---基础概念和部署教程

Hadoop入门篇01---基础概念和部署教程 Hadoop是什么Hadoop发展史Hadoop特点有哪些Hadoop版本Hadoop架构Hadoop 3.0新特性 Hadoop集群搭建集群简介集群部署方式standalone mode&#xff08;独立模式&#xff09;Pseudo-Distributed mode&#xff08;伪分布式模式&#xff09;Clu…

webpack的核心概念分别是什么,如何理解

这篇文章主要介绍了 title &#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家&#xff0c;也给大家做个参考&#xff0c;希望大家通过这篇文章可以有所收获。 webpack 是一种前端资源构建工具&#xff0c;一个静态模块打包器&#xff08;module bundler&#xff09;&…

UE5.1.1C++从0开始(4.虚幻的接口以及交互功能)

这一个章节对于第一次接触虚幻的人来说可以说是最绕的一个点&#xff0c;因为老师突然给你塞了很多的概念&#xff0c;对于这一块的学习&#xff0c;我个人的推荐是&#xff1a;先把蓝图搞明白了&#xff0c;再对应到C的代码中&#xff0c;不然一定会被整的晕头转向。还是&…

安装ms sql server2000提示安装失败详见sqlstp.log日志

安装ms sql server2000提示安装失败详见sqlstp.log日志 目录 安装ms sql server2000提示安装失败详见sqlstp.log日志 一、可能的情况-其它位置不能有对它的引用 1.1、先安装了Delphi其options-环境变量-其中path中有sql&#xff0c;注册表将其清除 1. 2、注册表搜索-Micro…

【Unity3d】Unity3d在Android平台上输入框的实现源码分析

一、前言 Unity3d引擎中有很多与Android原生交互的功能&#xff0c;比如如何调用Android渲染、Unity输入框的实现、Unity权限的申请、Unity调用相机功能等等&#xff0c;其实这些就是调用Android的api实现的。所有Java层的实现代码都是在unity-classes.jar这个jar包中。这篇文…

chatgpt的150个指令大全

chatGPT输出结果的质量高低&#xff0c;和你使用什么样质量的输入内容有关。 今天&#xff0c;小编整理了一些常用的ChatGPT指令&#xff0c;可以通过这些指令让AI帮你整理资料、撰写报告、知识学习、准备面试等等&#xff0c;赶紧收藏起来吧&#xff01; 如果还没有找到工具…

两万字详解!Netty经典32连问

两万字详解&#xff01;Netty经典32连问&#xff01; 前言 Netty是什么&#xff0c;它的主要特点是什么&#xff1f; Netty 应用场景了解么&#xff1f; Netty 核心组件有哪些&#xff1f;分别有什么作用&#xff1f; Netty的线程模型是怎样的&#xff1f;如何优化性能&…

四、Spring Cloud Alibaba-Ribbon

一、什么是Ribbon 目前主流的负载方案分为以下两种: 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的(比如 F5)&#xff0c;也有软件的(比如 Nginx) 。客户端根据自己的请求情况做负载均衡&#xff0c;Ribbon 就属于客户…

2023年全国硕士研究生入学统一考试英语(一)试题

2023年全国硕士研究生入学统一考试英语&#xff08;一&#xff09;试题 Section I Use of Englis Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B , C or D on the ANSWER SHEET.(10 points) Caravanserais were roads…