线程池【详解】

news2024/11/28 7:35:22

线程池

1、 线程池概念

  • 如果有非常多的任务需要非常多的线程来完成,每个线程的工作时间不长,就需要创建很多线程,工作完又立即销毁[线程频繁创建和销毁线程]

  • 频繁创建和销毁线程非常消耗性能,那么线程池,就是可以创建一些线程,放在"池子"中,用的时候去池子取一个线程去使用,使用完再放回去,线程可以重用

  • 线程池,底层其实就是集合队列,里面存储线程对象,用的时候去抽即可,就不要频繁创建线程了


使用线程池的好处是

  • 减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。

  • 如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存(OOM Out Of Memory)或者“过度切换”的问题

  • --> 以上摘自阿里官方手册

2、 线程池原理

image-20230301230326324

任务(task)提交(submit/execute)给线程池(threadpool),由线程池分配线程,运行任务,任务结束后,线程重新放入线程池供后续线程使用

3、 创建线程池的方式

使用线程池创建线程,执行任务

JDK提供了关于创建线程池的方式

  • Executors: 通过该类提供的静态方法来获得不同特点的线程池对象

    • newFixedThreadPool

    • newCachedThreadPool

    • newScheduledThreadPool

    • newSingleThreadExecutor

    • ...

  • ThreadPoolExecutor: 通过submit(Runnable task) 来提交任务,执行任务


线程池执行任务时,可以采用两种方法:

execute(): 没有返回值,无法判断任务是否执行成功

submit():会返回Future对象,通过该对象判断任务是否执行成功

线程池使用完要关闭时:

shutdown() 关闭线程池

4、 不同特点的线程池

通过Executors调用以下静态方法获得不同特点的线程池对象

方法类型解释
newFixedThreadPool固定大小线程池池中包含固定数目的线程,空闲线程一直保留。只有核心线程,线程数量固定,任务队列为LinkedBlockingQueue
newCachedThreadPool动态大小的线程池,原则上无上限无核心线程,非核心线程数量无限,执行完闲置60s后回收,任务队列SynchronousQueue
newScheduledThreadPool可以执行定时任务的线程池用于调度执行的固定线程池,执行定时或周期性任务。和弦线程数量固定,非核心线程数量无线,执行完闲置10ms后回收,任务队列为DelayedWorkQueue
newSingleThreadExecutor线程线程池只有一个线程的池,会顺序执行提交的任务,只有一个核心线程,无非核心线程,任务队列为LinkdBlockingQueue
newSingleThread ScheduledExecutor单线程定时任务线程池
newWorkStealingPool1.8提供新的方式创建线程池

以上线程池操作在阿里java开发手册中是不建议用的.....

说明:Executors 返回的线程池对象的弊端如下:
1)FixedThreadPool 和 SingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
2)CachedThreadPool 和 ScheduledThreadPool:
允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
-----------------------
OOM 内存溢出,即系统资源耗尽

分别演示不同特点的线程池:

package com.qf.theadpool;
​
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
​
/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/3/15
 * @desc
 */
public class TestThreadPool {
​
    public static void main(String[] args) {
    }
​
    private static void show3() {
        // 创建一个调度功能的线程池
        ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);
        // 给线程池提交任务
        for (int i = 1; i < 11; i++) {
            threadPool.schedule(new Runnable( ) {
                @Override
                public void run() {
                    Thread thread = Thread.currentThread( );
                    System.out.println(thread.getName( ) + "执行任务");
                }
            },5, TimeUnit.SECONDS);
        }
​
        threadPool.shutdown( );
    }
​
    private static void show2() {
        // 缓存线程池(可变大小)
        ExecutorService threadPool = Executors.newCachedThreadPool( );
​
        // 给线程池提交任务
        for (int i = 1; i < 10001; i++) {
            threadPool.execute(new Runnable( ) {
                @Override
                public void run() {
                    Thread thread = Thread.currentThread( );
                    System.out.println(thread.getName( ) + "执行任务");
                }
            });
        }
​
        threadPool.shutdown( );
    }
​
    private static void show1() {
        // 创建一个固定3个的线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
​
        // 给线程池提交10个任务
        for (int i = 1; i < 11; i++) {
            threadPool.execute(new Runnable( ) {
                @Override
                public void run() {
                    Thread thread = Thread.currentThread( );
                    System.out.println(thread.getName( ) + "执行任务");
                }
            });
        }
​
        // 关闭线程池
        threadPool.shutdown( );
    }
}

5、 ThreadPoolExecutor[重要]

  • ThreadPoolExecutor 很重要,有7个参数

参数名解释备注
int corePoolSize线程池的线程数量(核心线程数)不能小于0
int maximumPoolSize线程池可支持的最大线程数最大数量>=核心线程数
long keepAliveTime指定临时线程的最大存活时间不能小于0
TimeUnit unit指定存活时间的单位(秒,分,时,天)时间单位
BlockingQueue<Runnable> workQueue指定任务队列
ThreadFactory threadFactory指定哪个线程工厂创建线程
RejectedExecutionHandler handler指定线程忙,任务队列满的时候新任务来了怎么办?拒绝策略

举例子: 海底捞吃饭

  1. 核心线程数: 核心服务人员3个

  2. 最大线程数: 允许最多的服务人员数量10, (其中7个临时找的)

  3. 最大存活时间: 临时工不干活时间

  4. 时间单位:

  5. 阻塞队列: 门口的排队的人

  6. 线程工厂: 如何将服务人员(线程)创建来的

  7. 拒绝策略: 再来的任务不再接收直接拒绝(发券下次来,本次不接客...)

    
public static void main(String[] args) {
​
        ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(10);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3, // 核心线程数
                10,// 最大线程数
                10, // 最大存活时间
                TimeUnit.SECONDS,// 时间单位
                queue);// 阻塞队列
​
        // 给线程池提交任务
        for (int i = 1; i < 30; i++) {
            pool.execute(new Runnable( ) {
                @Override
                public void run() {
                    Thread thread = Thread.currentThread( );
                    System.out.println(thread.getName( ) + "执行任务");
                }
            });
        }
    }

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

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

相关文章

RJ45网口链接器和PCB板结构再生产上需要注意那些方面

华强盛电子导读&#xff1a;工程技术前面199中间2643后面0038 关于网口和PCB板板结合插件会出现几个问题 ...网口的尺寸结构&#xff0c;PCB板板的孔位小&#xff0c;这里强调&#xff0c;建议孔位开大一点&#xff0c;便于生产插件方便。 在插件生产过程中&#xff0c;RJ45网…

免费批量自动校正图片、PDF文档方向工具

功能介绍&#xff1a;批量自动识别图片和PDF文档页面方向&#xff0c;并校正为正确阅读方向&#xff08;非倾斜纠偏&#xff09; jpg校正演示 #修复exif信息导致的jpg图像显示和实际旋转不一致问题 #增加图像DPI选项,优先原图或者固定DPI&#xff0c;但这些只会对产生旋转的图…

qss的border-image和background-image和background-coloor和color

如果你的图片和按钮一样大&#xff0c;譬如40X40&#xff0c;那么两者都可以。 如果你的图片和按钮不一样大&#xff0c;用border-image会填充或者拉伸缩放以自适应按钮。 background-image则不会。 所以一般情况下&#xff0c;使用border-image会更合适。 border-image&…

深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)

目录 &#x1f354; 前言 &#x1f354; 图像基础知识 1. 像素和通道的理解 2. 小节 &#x1f354; 卷积层 1. 卷积计算 2. Padding 3. Stride 4. 多通道卷积计算 5. 多卷积核卷积计算 6. 特征图大小 7. PyTorch 卷积层 API 7. 小节 &#x1f354; 池化层 1. 池…

openlayers+vite+vue3加载离线地图并实现初始化(一)

前景提示&#xff1a;本文主要讲解使用vite工具构建的项目&#xff0c;利用openlayers实现离线地图的主要一些功能&#xff0c;包括初始化地图、打点、画线、弹窗等等&#xff0c;这些后续有时间会持续为大家更新&#xff0c;本文主要阐述如何实现其首要功能离线地图的初始化。…

linux系统删除文件后,可用率没变,磁盘还是满的

linux系统磁盘清理排查 前言排查解决 前言 某天更新服务时&#xff0c;发现服务怎么也上传不了&#xff0c;原因是磁盘空间不足&#xff0c;这很简单&#xff0c;直接找到大文件删除rm -rf 即可&#xff0c;但是我删除之后&#xff0c;df -h 发现磁盘空间一点变化都没有&#…

Unity XR Interaction Toolkit 通过两个手柄控制物体放大缩小

1&#xff1a;给物体添加 XR General Grab Transformer 脚本 2&#xff1a;XR Grab Interactable 的 select mode 选择 Multiple

基于Burp爆破验证码

目录 基于Burp爆破验证码 一、验证码识别 二、爆破 1、访问登录请求并发送至intruder模块 2、访问验证码url并将截取的请求发送至captcha-killer模块 3、intruder模块设置 3、爆破结果 4、使用burp完成上述操作&#xff0c;存在以下问题&#xff1a; 基于Burp爆破验证码…

Transformer系列-6丨LRNet和Stand-Alone Self-Attention网络解析

0. 前言 本次主要分享之前看的两篇将自注意力机制self-attention应用在视觉感知任务的文章&#xff0c;分别为LRNet和Stand-alone self-attention。为了深化读者的理解&#xff0c;本文提供了较为详细的中文注释的代码。 首先了解一下这两篇文章的背景&#xff0c;其都是在Vi…

【CSP:202309-1】坐标变换(其一)(Java)

题目链接 202309-1 坐标变换&#xff08;其一&#xff09; 题目描述 求解思路 直接暴力模拟即可。 实现代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n, m;n in.nextInt();m in.…

Python 实现自定义异常

在Python编程中&#xff0c;异常处理是保证程序健壮性的重要机制。Python提供了一些内置的异常类&#xff0c;如ValueError、TypeError、IndexError等&#xff0c;开发者可以直接使用这些类来捕获和处理程序运行中出现的各种错误。然而&#xff0c;某些场景下&#xff0c;内置的…

破晓之战:物流“三剑客”扬帆东南亚

【潮汐商业评论/原创】 70公里的曼谷至春武里省之旅&#xff0c;在日常或许只是一趟轻松的自驾。但对于“美美”服装的员工来说&#xff0c;这却成了一场午夜时分的紧急挑战。 忙碌了一整天的她&#xff0c;直到凌晨才猛然想起&#xff0c;VIP客户的货物必须在清晨前送达春武…

Android.bp和Android.mk文件有的区别

文章目录 1. 构建系统2. 语法和格式3. 可维护性和扩展性4. 编译效率5. 未来趋势 在Android的构建系统中&#xff0c; Android.mk和 android.bp是用于定义如何编译项目文件的两种文件类型&#xff0c;它们有一些显著的区别。 1. 构建系统 Android.mk&#xff1a;使用于基于GN…

软考高级考完了,怎么评职称?

首先祝贺您成功获得了软考高级证书&#xff0c;拥有了高级证书意味着具备了申请高级职称的资格&#xff01;这样就不会因为缺乏资格而错失申请空缺岗位评职称的机会。接下来&#xff0c;我将帮助您处理申请高级职称的事宜&#xff01;如果对您有帮助&#xff0c;请不要忘记点赞…

本地生活服务商系统如何利用本地推获得更多曝光?

随着本地生活赛道中的竞争愈演愈烈&#xff0c;越来越多的本地生活服务商和本地生活商家开始计划着通过在本地推等平台投放相关信息&#xff0c;以提高品牌店铺的曝光量和知名度。不过&#xff0c;就目前的情况来看&#xff0c;绝大多数人都陷入了一种“投入多&#xff0c;转化…

创客匠人标杆对话(上):她如何通过“特长+赛道”实现财富升级

老蒋创客圈第64期对话标杆直播连麦&#xff0c;本期我们邀请到【iAMU蒙特梭利翻转星球】平台创始人申晓慧老师。 为我们揭秘“如何挖掘人生首个百万&#xff0c;实现财富升级&#xff1f;”&#xff0c;深度分享如何提炼用户痛点&#xff0c;高效引流新用户&#xff1f;如何通…

构建基于LLM的应用程序——为您的应用程序选择合适的LLM

。 在本章中&#xff0c;将引导您完成为应用程序选择合适LLM的过程。我们将涵盖以下几个主题&#xff1a; 市场上最具前景的LLM概览比较LLM时应使用的主要标准和工具规模与性能之间的权衡 在本章结束时&#xff0c;您应该能够清楚地理解如何为您的应用程序选择合适的LLM&…

18款各具特色的项目管理系统软件,项目经理用过都说好!

项目管理是指在项目活动中运用专门的知识、技能、工具和方法&#xff0c;使项目能够在有限资源限定条件下&#xff0c;实现或超过设定的需求和期望的过程。 简单来说&#xff0c;项目管理系统就像是交响音乐会指挥手中的乐谱&#xff0c;能为项目经理清晰地呈现出项目的各个音符…

第十二章 迁移学习-实战宝可梦精灵

文章目录 一、Pokemon数据集1.1 数据集收集1.2 数据集划分1.3 数据集加载1.4 数据预处理1.5 pytorch自定义数据库实现 二、ResNet网络搭建三、训练与测试四、迁移学习4.1 pytorch实现迁移学习 一、Pokemon数据集 1.1 数据集收集 # git下载 git lfs install git clone https://…

【大数据】什么是数据中台?

随着企业规模不断扩大、业务多元化——中台服务架构的应运而生。“中台”早期是由美军的作战体系演化而来的&#xff0c;技术上说的“中台”主要是指学习这种高效、灵活和强大的指挥作战体系。阿里在今年发布“双中台ET”数字化转型方法论&#xff0c;“双中台”指的是数字中台…