如何理解线程池中的参数设计

news2025/4/8 21:53:20

如何理解线程池中的参数设计

  • 你的线程池的参数怎么配置?线程数量设置多少合理?
  • 如何确定一个线程池中的人物已经完成了
  • 为什么不建议使用java自带的Executors创建线程池
  • 线程池里面的阻塞队列设置多少合理?

考察:了解你对技术的掌握程度,|对于技术的理解、场景问题

线程池的参数有哪些

  • 核心线程数
    常驻在线程池中的工作线程数量
  • 最大线程数
    表示线程池中最大能容纳的线程数量(扩容)
  • 阻塞队列
    当核心线程跑满的时候,存储任务的容器
  • 等待时间
  • 等待时间单位
  • 拒接策略
    超过线程池能够处理的容量的时候的保护机制
  • 线程工厂

线程池的设计

池化技术->实现了对线程的复用(一个技术的产生背景)

  • 线程数量不可控
  • 线程的频繁创建和销毁带来的开销

ThreadPoolExector(Java实现)

通过生产者-消费者模型来解决线程服用问题(技术方案)
可以把基于阻塞队列的生产者消费者模型放大一下,就是分布式消息队列。
在这里插入图片描述

public class ThreadPoolDemo {
    static Queue<Runnable> tasks = new LinkedList<>();
    static class WorkThread implements Runnable {
        @Override
        public void run() {
            while (true) {
                Runnable task = tasks.poll();
                if (task != null) {
                    System.out.println("工作线程开始执行:" + Thread.currentThread().getName());
                    task.run();
                }else {
                    System.out.println("当前没有任务执行:" + Thread.currentThread().getName());
                    synchronized (WorkThread.class){
                        try {
                            WorkThread.class.wait();
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    
    public static void main(String[] args) {
        WorkThread workThread = new WorkThread();
        new Thread(workThread).start();
        Scanner scanner = new Scanner(System.in);
        while (true){
            String s = scanner.nextLine();
            tasks.add(()->{
                System.out.println(Thread.currentThread().getName()+"数据定时同步的任务,开始执行" + s);
            }) ;
            synchronized (WorkThread.class){
                WorkThread.class.notify();
            }
    
        }
     
    }
}

线程池的价值是什么?

架构思维

java开发,就真的只要会CRUD
职业发展-》架构,技术经理

  • 生产者消费模型(支付,第三方支付,异步发送到第三方支付)
  • 扩容和缩容的思想,工作线程的创建和销毁
  • 阻塞队列
  • 保护策略(拒绝策略),考虑系统的稳定性

Synchronized的锁升级

无锁-》偏向锁-〉轻量级锁-》重量级锁。

  • 什么是偏向锁,什么是轻量级锁,什么是重量级锁。
  • 为什么要设计锁升级?
  • Synchronized是提供了锁的公平性吗?
  • Synchronized锁标记怎么存储的?
  • 重量级锁为什么称为重量级锁?

java5之前,是没有锁升级这个概念的
无锁-》重量级锁
加锁会带来性能开销:

  • 内核指令的调用,涉及到上下文切换
  • 线程阻塞唤醒,涉及到上下文切换‘
    消耗cpu资源,影响程序的执行性能!
    加锁的方式从并行变成了串行。

两个层面的优化

使用层面的优化

控制加锁的位置,也就是锁的范围。

JVM层面的优化

1,编译器的优化,深度编译(锁的膨胀和锁的消除)
2,锁的升级

思考:能不能在让线程阻塞之前,就竞争到锁呢?
轻量级锁(自旋锁)
自旋竞争锁,通过循环尝试获取锁来竞争到锁资源。平衡循环次数
前提是:通过自旋尝试获得锁的代价,要比线程进入到阻塞代价更低

价值

提炼出有价值的架构思维
如何平衡好性能和安全性之间的关系

库存,防止超卖和少卖
ConcurrenthashMap 1.7的版本锁的是Segment,1.8版本锁的是Node节点
Mysql,表锁,行锁,间隙锁,临键锁,MVCC乐观锁

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

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

相关文章

如何查看SSL证书到期时间

随着互联网的发展&#xff0c;SSL证书在保护网站安全方面发挥着越来越重要的作用&#xff0c;SSL证书过期之后带给网站的损失也比较大&#xff0c;许多网站管理员可能会忽略SSL证书到期的问题&#xff0c;从而导致网站安全漏洞。今天&#xff0c;就随SSL盾小编了解有什么办法查…

开源云真机平台-Sonic平台-python自定义脚本(持续更新中)

开源云真机平台-Sonic平台-python自定义脚本(持续更新中) 1、获取设备序列号 udId sys.argv[1:][1] 如&#xff1a; # -*- coding: utf-8 -*- import os,sys,json udId sys.argv[1:][1] 2、获取全局参数 text1 sys.argv[1:][2] 如&#xff1a; # -*- coding: utf…

邻接矩阵、可达性矩阵、完全关联矩阵、可达性矩阵的计算

邻接矩阵&#xff1a;很简单&#xff0c;就是两个点有关系就是1&#xff0c;没有关系就是0 可达性矩阵&#xff1a;非常简单&#xff0c;两点之间有路为1&#xff0c;没有路为0 可发行矩阵的计算&#xff1a;有n个元素&#xff0c;初始可达性矩阵为A&#xff0c;那么最终的矩阵…

【软考中级-软件设计师】day7:图

概述 1-2道选择 图的存储 图的遍历 图的最小生成树 prim算法 kruscal算法 2135476 选7不选6是因为4的先删除&#xff08;vi必须在vj之前&#xff09;跟4有关的删了以后&#xff0c;入度为0的结点只剩下7&#xff0c;所以选7再6

烟火识别系统、ai视频烟火自动报警系统、烟火监测系统、烟火报警

在现代社会&#xff0c;烟火&#xff08;包括烟雾和火焰&#xff09;的及时识别对于防灾减灾具有至关重要的作用。随着人工智能技术的发展&#xff0c;基于AI的视频烟火识别系统已成为研究和应用的热点。这些系统通过分析监控视频&#xff0c;能够迅速准确地识别出烟雾和火焰&a…

内存分区模型---C++

目录 内存分区模型1.1 程序运行前1.2 程序运行后1.2.1 new操作符 内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的&#xff1b;全局区&#xff1a;存放全局变量和静态变量以及常…

SpringBoot学习(五)-Spring Security配置与应用

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! Spring Security Spring Security是一个基于Java的开源框架&#xff0c;用于在Java应用程…

网络传输(TCP)

前言 我们tcpdump抓包时会看到除报文数据外&#xff0c;前面还有一段其他的数据&#xff0c;这段数据分为两部分&#xff0c;ip包头&#xff08;一般20字节&#xff09;和tcp包头&#xff08;一般20字节&#xff09;&#xff0c;一般这两个头长度和为40&#xff0c;我们直接跳…

HarmonyOS 开发基础(九)forEach

HarmonyOS 开发基础&#xff08;九&#xff09;forEach 一、基础使用 Entry Component struct Index {// 创建一个变量&#xff0c;用来存储图片网络网址imageUrl: string https://gw.alicdn.com/imgextra/i2/2201227850912/O1CN01B7gVvP1Ibk6HMiDRz_!!2201227850912.jpg_Q75.…

父类,父类的分类、子类 同时重写方法,调用问题

做一个猜想&#xff0c;当父类、父类的分类、子类 都写了同一个方法&#xff0c;那么在调用的时候会优先调用哪个方法呢&#xff1f;我们可以先写一个简单的demo implementation Person (void)test {NSLog("%",self.class); }end然后是Person的分类 #import "…

git 使用 submodule 如何指定分支

写在前面, 作为一个前端我是不喜欢使用 submodule的, 我更喜欢 npm 包的管理方式。 首次添加子模块 git submodule add -b <branch> <remote> <path> 不指定分支就不传 -b <branch> <branch> 分支名<remote> 仓库地址<path> 子模块…

零样本学习研究方向sci四区期刊总结

APPLIED OPTICS sci 四区 非OA 出版商:OPTICA 期刊官方网站: http://www.opticsinfobase.org/ao/home.cfm 期刊投稿网址: http://www.opticsinfobase.org/ao/journal/ao/author.cfm#submit 虽然有zsl的名字但是这是全息图像专刊&#xff0c;跟我的方向应该不是太相关。 MO…

C# 微信小程序获取群id

前提 有个需求&#xff0c;需要限制小程序的抽奖只能在某个群内&#xff0c;需要知道谁在群里面&#xff0c;但是微信并没有提供谁在群里面的方法&#xff0c;不过提供了获取群id的方法&#xff0c;这样加上限制分享就能保证群里的参加&#xff0c;即时分享出去了&#xff0c;…

网络层详解

目录 前言 一、IP协议 1、IP协议报头 2、协议字段理解 &#xff08;1&#xff09;4位版本 &#xff08;2&#xff09;4位首部长度 &#xff08;3&#xff09;8位服务类型 &#xff08;4&#xff09;16位总长度 &#xff08;5&#xff09;标识、标志与片偏移 &#xf…

【自控实验】2. 采样控制系统特性

本科课程实验报告&#xff0c;有太多公式和图片了&#xff0c;干脆直接转成图片了 仅分享和记录&#xff0c;不保证全对 通过对二阶连续系统、二阶采样系统和具有保持器的二阶采样系统仿真实验&#xff0c;比较三种系统的特性&#xff0c;加深对采样控制系统的了解 使用matl…

阿里云OSS上传视频,可分片上传

uniappH5实现 阿里云OSS上传视频 示例图&#xff1a; 上传视频完整示例代码&#xff1a; 使用npm安装SDK开发包&#xff0c;安装命令为 npm install ali-oss --save accessKeyId 和 accessKeySecret 还有 bucket 替换成你的就行。 multipartUpload 的第一个入参是&#x…

leetcode 动态规划(最后一块石头的重量II、目标和、一和零)

1049.最后一块石头的重量II 力扣题目链接(opens new window) 题目难度&#xff1a;中等 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < …

Redis的设计、实现

数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合),但这些只是Redis对外的数据结构。 实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的…

动手学深度学习-卷积神经网络

卷积神经网络 在前面的章节中&#xff0c;我们遇到过图像数据。这种数据的每个样本都由一个二维像素网格组成&#xff0c;每个像素可能是一个或者多个数值&#xff0c;取决于是黑白还是彩色图像。到目前为止&#xff0c;我们处理这类结构丰富的数据方式还不够有效。我们仅仅通…

[Kubernetes]7. K8s包管理工具Helm、使用Helm部署mongodb集群(主从数据库集群)

上一节讲解了[Kubernetes]6. k8s Pod配置管理ConfigMap & Secret以及传递环境变量的使用,k8s的命名空间以及使用kubens管理命名空间的使用,这里来介绍一下Helm的使用 一.Helm相关介绍 1.介绍 在 kubernetes 系统上部署容器化应用时需要事 先手动编写资源配置清单文件 以…