线程池的介绍

简介: 线程池的介绍

线程池

一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。(节选自百度百科)

🔎线程池的参数介绍

这是线程池的几种构造方法

下面将逐一介绍构造方法种的参数,以红框的构造方法为例

🌻参数(int corePoolSize, int maximumPoolSize)

corePoolSize:表示核心线程数

maximumPoolSize:表示最大线程数

举个栗子🥝

将线程池想象成一个公司

公司里有很多的员工,包括 (1)正式员工 (2)实习员工/非正式员工

其中

核心线程数表是正式员工的数量

最大线程数表是正式员工的数量 + 实习员工的数量


🌻参数(int corePoolSize, int maximumPoolSize)

long keepAliveTime:表示保持存活的时间

TimeUnit unit:表示存活时间的单位

注意!

保持存活的时间是实习员工保持存活的时间

举个栗子🥝

公司的正式员工因为签订了劳动合同,所以不能随意的辞退

实习员工因为签订的是实习合同,所以辞退也不会有什么事

当公司业务比较繁忙的时候,就需要多招聘一些实习生来增加生产力

但当业务少了的时候,也不能直接就将实习生辞退

需要观察一下是不是只是最近一两天业务比较少,过后还是比较忙

如果是,就先让实习员工继续实习

如果不是,直接辞退

这就是实习员工保持存活的时间


🌻参数(BlockingQueue workQueue)

表示阻塞队列

线程池要管理很多任务,这些任务是通过阻塞队列进行组织的


🌻参数(ThreadFactory threadFactory)

表示工厂模式

创建线程的辅助的类


🌻参数(RejectedExecutionHandler handler)

表示线程池的拒绝策略

下面介绍线程池的4种拒绝策略


🌼case1(ThreadPoolExecutor.AbortPolicy)

表示如果队列中任务满了,继续添加任务,将会抛出异常

🌼case2(ThreadPoolExecutor.CallerRunsPolicy)

表示添加该任务的线程自己执行该任务

🌼case3(ThreadPoolExecutor.DiscardOldestPolicy)

表示丢弃队列中的最老的任务(队首),去执行添加的任务

🌼case4(ThreadPoolExecutor.DiscardPolicy)

表示丢弃新添加的任务,继续执行队列中的任务


🔎线程池的工作流程

🌻模拟实现线程池

模拟实现一个简单的线程池

//模拟实现线程池
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
class ExThreadPool {
    //创建阻塞队列,将所需执行的任务放到队列中
    private BlockingQueue<Runnable> queue = new LinkedBlockingDeque<>();
    //submit()方法,创建所需执行的任务
    public void submit(Runnable runnable) throws InterruptedException{
        queue.put(runnable);
    }
    //创建一个固定线程数为n的线程池
    public ExThreadPool(int n) {
        for(int i = 0;i < n;i++) {
            Thread t = new Thread(() -> {
                while(true) {
                    try {
                        Runnable runnable = queue.take();
                        runnable.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }
    }
}
public class Test {
    public static void main(String[] args) throws InterruptedException {
        ExThreadPool pool = new ExThreadPool(10);
        for (int i = 0; i < 1000; i++) {
            int num = i;
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello " + num);
                }
            });
        }
    }
}

代码描述

创建一个线程数为10的线程池

执行System.out.println("hello " + num); 1000次


🌻线程池的工作流程

1.提交任务

2.判断核心线程数是否达到最大

--------2.1未到达最大值:执行任务

--------2.2达到最大值:判断阻塞队列是否已满

3.阻塞队列时否已满

--------3.1未满:将任务添加到阻塞队列等待线程执行

--------3.2已满:判断线程数是否达到最大值

4.线程数是否达到最大值

--------4.1未达到最大值:创建非核心线程执行任务

--------4.2达到最大值:执行拒绝策略

图片出处


🔎使用Executors 创建常见的线程池

public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(10);
}

newFixedThreadPool(n)

创建固定线程数为n的线程池

public static void main(String[] args) {
        ExecutorService pool = Executors.newCachedThreadPool();
}

newCachedThreadPool()

创建线程数目动态增长的线程池

public static void main(String[] args) {
        ExecutorService pool = Executors.newSingleThreadExecutor();
}

newSingleThreadExecutor()

创建只包含单个线程的线程池

public static void main(String[] args) {
        ExecutorService pool = Executors.newScheduledThreadPool(1000);
}

newScheduledThreadPool(n)

设定延迟时间n(单位:毫秒)后执行命令


🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍

大家有什么不太理解的,可以私信或者评论区留言,一起加油

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
NLP文本生成全解析:从传统方法到预训练完整介绍
NLP文本生成全解析:从传统方法到预训练完整介绍
366 0
|
存储 数据库 Android开发
|
Web App开发 编解码 Ubuntu
YouTube下载视频教程:常用的网站软件插件APP都有涉及
有时候可能需要YouTube上的视频来进行一些操作,比如教程演示,语言学习,视频编辑等.....那么YouTube视频怎么下载下来呢?方法比较多。在这篇文章里我会给大家介绍一些下载YouTube视频的常用网站、浏览器插件、电脑软件和手机APP,方便大家找到最合适的方法去保存油管视频。
2858 1
YouTube下载视频教程:常用的网站软件插件APP都有涉及
|
新零售 人工智能
阿里巴巴联合汉仪重磅推出五款人工智能字体:汉仪天真体、英雄体等
众所周知传统做字的人力成本非常之高,如果全靠人类设计师来完成,一套标准字库从设计到完成需要一年多的时间。
13307 0
|
11天前
|
Web App开发 监控 Windows
如何检测自己的工作电脑是否被公司监控?如何知道自己的电脑被监控?
本文介绍了如何检查公司是否在未经允许的情况下监控员工电脑。内容包括检查安装程序、浏览器插件、分析网络流量、观察电脑异常行为以及检查组策略等实用方法,并提供了相关工具和操作步骤,帮助用户识别潜在的监控行为。
367 4
|
4月前
|
安全 网络安全 Python
应对requests 2.28.x版本中SSL证书验证失败的错误处理方法。
在你安全地解决了这一切之后,你的请求就能够在HTTPS的加持下,犹如骑士横扫战场,高枕无忧地传递信息了。记住,网络的世界里,安全永远是你的头号任务。遵循正道,才能让你的代码在数据的草原上,驰骋千里。
194 16
|
KVM 虚拟化
KVM的热添加技术之硬盘管理
文章介绍了如何在KVM虚拟机上进行硬盘的热添加、扩容以及如何使这些配置永久生效的详细步骤和命令。
210 3
KVM的热添加技术之硬盘管理
|
12月前
|
缓存 安全 Linux
使用macof发起MAC地址泛洪攻击
使用macof发起MAC地址泛洪攻击
216 2
|
12月前
|
JavaScript 前端开发 API
Vue2与Vue3插槽使用的区别及案例
Vue 3在插槽功能上的改进,体现了其对开发体验的持续优化。通过简化API、加强动态特性和提升性能,Vue 3使得插槽的使用更加灵活和高效。这些改进不仅有助于减轻开发者的负担,还为组件之间的高级交互和内容复用打开了新的可能性。随着Vue生态系统的不断成熟,我们有理由相信,Vue将继续为前端开发提供强大且易用的工具。
200 3
|
分布式计算 MaxCompute
MaxCompute中,collect_set函数是一个聚合函数
MaxCompute中,collect_set函数是一个聚合函数
350 1