多线程之线程池

news2024/9/21 18:42:42

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、什么是线程池
  • 二.为什么要有线程池
      • 引入:
      • 为什么从池子里取,比创建线程速度要快
      • 什么是用户态,什么是内核态
      • 最终结论:
  • 三.标准库中的线程池
  • 四.自己实现一个线程池
    • 生产者消费者模型策略:
    • 代码演示:
    • 完整代码:
  • 五.线程池的拒绝策略 (超级重点):
    • 引入
    • 标准库中拒绝策略(对于threadpoolExecutr的理解)
    • 延伸的问题:
      • 实际开发中线程池数目如何确定:


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是线程池

类似String字符串常量池,mysql jdbc数据库链接池
搞一个池子,创建好许多线程,当需要执行任务的时候,不需要在重新创建线程,而是直接从池子里取一个现成的线程,直接使用,用完了也不释放,而是直接放回线程池里

二.为什么要有线程池

引入:

线程诞生的目的是进程太重量了,创建进程或销毁进程,都是比较低效(内存资源的申请和释放),线程就是共享了内存资源,新的线程复用之前的资源,不必重新申请,但是如果线程创建的速率进一步频繁,此时线程创建开销仍然不能忽略此时可以采用线程池来优化速度

为什么从池子里取,比创建线程速度要快

实际上,创建线程也需要申请资源(很少),创建线程,也是要在操作系统内核中完成,涉及到用户态->内核态切换操作,也存在一定的开销

什么是用户态,什么是内核态

在这里插入图片描述
应用程序发起的一个创建线程的行为,本质上是pcb,是内核中的数据结构,
应用程序需要通过系统调用,进入到操作系统内核中执行,
内核完成pcb的创建,把pcb加入到调度队列,再返回给应用程序

从线程池取线程,把线程放回线程池,这是纯用户态的逻辑
从系统这里创建线程,是用户态+内核态共同完成的逻辑

最终结论:

使用线程池是纯用户态的操作,要比创建线程(经历内核态的操作)要快**

三.标准库中的线程池

  ExecutorService pool= Executors.newCachedThreadPool();
        pool.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("这是任务");
            }
        });

0.标准库中线程池构造方法的参数
在这里插入图片描述
在这里插入图片描述

1.如果直接采取构造方法创建线程池(参数太多)写起来麻烦,为了简化构造,标准库提供了一系列工厂方法

2.此处创建线程池没有显示new,而是通过executor类的静态方法newCachedThreadpool来完成

3.工厂模式的好处:
绕开构造方法的局限(参数太多),而且构造方法有时候不能重载(返回值,参数列表都相同)
在这里插入图片描述

我们可以使用普通方法代替构造方法(普通方法方法名可以随便取来重载),在普通方法创建point对象,通过其他手段设置

 public static Point makePointByXY(double x,double y){
        Point p=new Point();
        p.setR(x);
        p.setA(y);
        return p;
    }
    private void setA(double a){

    }
    private void setR(double r){

    }
   

线程池的使用采取submit方法,把任务提交到线程池中即可,线程池里面有线程完成这里的任务

四.自己实现一个线程池

一个线程池可以同时提交n个任务,对应的线程池就有m个线程来负责完成这n个任务

生产者消费者模型策略:

先搞一个阻塞队列,每个被提交的任务都被放到阻塞队列当中,
搞m个线程来取队列元素,如果队列空了,m个线程自然阻塞等待,
队列不为空,每个线程都取任务,执行任务,再取下一个任务,直到队列为空

代码演示:

  public MyThreadPool(int m){
        //在构造方法中,创建出m个线程,负责完成工作
        for (int i = 0; i <m ; i++) {
            Thread t=new Thread(()->{
                while(true){
                    try {
                        Runnable runnable=queue.take();
                        runnable.run();
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }
    }

创建m个线程,让线程持续的扫描队列,执行其中方法

完整代码:

package Threading;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

//演示自己创建的线程池
class MyThreadPool{
    private BlockingQueue<Runnable> queue=new LinkedBlockingDeque<>();

    public void submit(Runnable runnable) throws InterruptedException{
        queue.put(runnable);
    }

    public MyThreadPool(int m){
        //在构造方法中,创建出m个线程,负责完成工作
        for (int i = 0; i <m ; i++) {
            Thread t=new Thread(()->{
                while(true){
                    try {
                        Runnable runnable=queue.take();
                        runnable.run();
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }
    }
}
public class demo28 {
    public static void main(String[] args) throws InterruptedException {
        MyThreadPool pool=new MyThreadPool(10);
        for (int i = 0; i <1000 ; i++) {
            int taskId=i;
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("执行当前任务: "+taskId+"当前线程: "+Thread.currentThread().getName());
                }
            });
        }
    }

}

五.线程池的拒绝策略 (超级重点):

引入

线程池的拒绝策略,线程池的任务队列已经满了(工作线程已经忙不过来了)
当前任务数>workqueue.size()+maximumpoolsize
如果又有人往里添加新的任务,问题:
这个策略对于高并发服务器,也是非常有意义的

标准库中拒绝策略(对于threadpoolExecutr的理解)

在这里插入图片描述
AbortPolicy 直接丢弃任务,抛出异常,必须处理好异常,否则打断当前执行流程默认策略
CallerrunsPolicy 只用调用者所在的线程来处理任务
discradoldesrPolict 丢弃等待队列中最旧的任务,并执行当前任务
DiscardPolicy 直接丢器,啥事没有

延伸的问题:

实际开发中线程池数目如何确定:

实践是检验真理的唯一标准
针对你的程序进行性能测试,分别给线程设置成不同的数目,分别记录每种情况下,你的程序一些核心性能制表和系统负载情况,选一个最合适的

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

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

相关文章

aws 负载均衡clb/nlb/alb

目录 概述 传统负载均衡器&#xff08;Classic Load Balancer&#xff09; DNS解析 健康检查&#xff08;Health Check) 监听器&#xff08;Listeners&#xff09; 连接耗尽&#xff08;Connection Draining&#xff09; 粘性会话/会话关联&#xff08;Sticky Sessions/…

(四)手写简单版MyBatis框架

文章目录环境搭建第一步&#xff1a;资源⼯具类第二步&#xff1a;定义SqlSessionFactoryBuilder类第三步&#xff1a;定义SqlSessionFactory类第四步&#xff1a;定义JDBC事务管理器第五步&#xff1a;定义数据源类第六步&#xff1a;定义MyMappedStatement类第七步&#xff1…

基于遗传算法卡车无人机旅行推销员问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Leetcode刷题111. 二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 示例 2&#xff1a; 输入…

Python_机器学习_算法_第7章_7.拓展知识

Python_机器学习_算法_第7章_7.拓展知识 文章目录Python_机器学习_算法_第7章_7.拓展知识7.拓展知识7.1. 其他距离公式1 标准化欧氏距离2 余弦距离3 汉明距离【了解】4 杰卡德距离【了解】5 马氏距离【了解】7.2.再议数据分割1 留出法2 交叉验证法2.1 交叉验证法基本介绍2.2 KF…

ARM发布Cortex-X3和Cortex-A715

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; ARM公司发布了第二代 AR…

x86 smbus 下挂eeprom不能写问题

目录 背景 分析 驱动影响 SPD register 接口 只读 修改验证 总结 背景 x86 smbus上下挂一个eeprom&#xff0c;只能读取&#xff0c;不能写入。 写入命令采用&#xff1a; i2cset -y -f 0 0x50 0 0x33 即向总线0 下的0x50 地址的eeprom偏移量0 写入数据0x33&#xff0c; 命令…

哈夫曼树原理及Java编码实现

文章目录前言一、哈夫曼树原理二、哈夫曼编码&#xff08;Java题解&#xff09;参考资料前言 所有博客文件目录索引&#xff1a;博客目录索引(持续更新) 源代码&#xff1a;Gitee—Huffman.java、Github—Huffman.java 一、哈夫曼树原理 对于哈夫曼树的构造以及权值计算原理…

Java语言高级-10MySQL-第2节MySQL安装与使用

2、MySQL数据库软件 1、安装 详细见视频 2、卸载 1、去mysql的安装目录找到my.ini文件 “复制datadir “C:/programData/MySQL/MySQL Server 5.5/Data” 2、卸载MySQL 控制面板->程序卸载&#xff0c;但是此时并没有卸载干净 3、删除C:/ProgramData目录下得MySQL文件夹 注意…

java 内部类

小镇做题家 前段时间很火的一个话题“小镇做题家”&#xff0c;我没有具体了解&#xff0c;我以为是在鼓励一些努力拼搏的人。 某一天&#xff0c;禁不住好奇&#xff0c;我打开了百度百科&#xff0c;看了看小镇做题家的解释 就是指一些村里或者小镇的人&#xff0c;通过学习…

模板和泛型编程(上)

目录函数模板泛型编程函数模板概念及原理函数模板的实例化函数模板的匹配原则类模板类模板实例化函数模板 泛型编程 泛型编程&#xff08;Generic Programming&#xff09;最初提出时的动机很简单直接&#xff1a;发明一种语言机制&#xff0c;能够帮助实现一个通用的标准容器…

猿创征文|Python迭代器、生成器、装饰器、函数闭包

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 Python迭代器、生成器、装饰器、函数闭包1. 迭代器 iterator☞迭代器协议☞Python中的for循环2. 生成器…

C语言qsort()函数针对:整型、单个字符、字符串、结构体,超详细讲解(多维度分析举例,小白一看就懂!!!!!)

目录 一、前言 二、qsort()函数 &#x1f351;qsort()函数简介 &#x1f349;qsort()函数中整型、double型、字符型的应用 &#x1f4a6;整型 &#x1f4a6; double型 &#x1f4a6;字符排序 &#x1f34e;qsort()函数在字符串中的应用 &#x1f4a6;在字符串中按首字母…

Android NDK开发基础

文章目录cmake语法基础cmake添加日志&#xff1a;cmake增加宏字符串比较cmake在build.gradle中传递编译参数到cmake通过javah生成native对应的c头文件jni和java之间字符串的相互操作JavaVM和JNIEnv字符串的编码native方法静态注册和动态注册静态注册动态注册extern cC中STATIC和…

SpringCloud Alibaba-Sentinel保姆级教程

文章目录1、Sentinel前奏1.1、服务雪崩效应1.2、常见容错方案1、隔离2、超时3、限流4、熔断5、降级1.3、常见容错组件1、Hystrix2、Resilience4J3、Sentinel2、Sentinel入门2.1、什么是Sentinel2.2、实战编码1、安装Sentinel服务端2、微服务引入Sentinel2.3、Sentinel流控模式1…

YOLOv5蒸馏 | 知识蒸馏理论篇 | 1/2

之前在《一文搞懂【知识蒸馏】【Knowledge Distillation】算法原理》这篇文章中介绍过一些知识蒸馏的原理,这篇博文将会着重介绍目标检测领域的知识蒸馏原理。 文章目录 1.《Object detection at 200 Frames Per Second》1.1 蒸馏难点1.2 蒸馏损失1.3 实验结果2. 《Learning E…

计算机毕业设计ssm+vue基本微信小程序的体检预约小程序

项目介绍 我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;体检预约系统小程序被用户普遍使用&#xff0c;为方便用户…

【前端】CSS(1) —— CSS的基本语法和一些简单的选择器

JavaEE传送门JavaEE 网络原理——网络层与数据链路层 【前端】HTML入门 —— HTML的常见标签 目录CSS基本语法注释引入方式内部样式内联样式外部样式代码风格样式格式样式大小写空格规范CSS 选择器标签选择器类选择器id 选择器通配符选择器复合选择器后代选择器子选择器并集选…

文件包含漏洞和hash破解

介绍 Windows是当今世界最主要的操作系统&#xff0c;因为它易于使用的GUI可访问性。大约85%的市场份额已成为攻击的关键操作系统。此外&#xff0c;大多数组织使用Active Directory来设置其Windows域网络。微软聘请NTLM&#xff08;New Technology LAN Manager&#xff09;和…

Pico Neo3 4VR游戏下载地址及十大好玩游戏推荐

大家好&#xff0c;杰克今天为大家分享的是VR一体机游戏。 说到VR一体机&#xff0c;我们首先想到的一定是国产之光pico啦&#xff0c;picovr被认为是国内最被看好的VR一体机&#xff0c;有望在国内取代红极一时的OculusQuest&#xff0c;填补这块市场的空白。OculusQuest将6D…