java-线程池

news2025/2/2 8:33:38

1、线程池的自我介绍:
● 线程的数量过多会反复的创建并销毁
● 为什么使用线程池?
○ 第一:反复创建线程开销大
○ 第二:过多的线程会占用太多内存
解决以上两个问题的思路:
○ 用少量的线程-避免内存占用过多
○ 让这部分线程都保持工作,且可以反复执行任务—避免生命周期的损耗

2、线程池的参数
corePoolSize 核心线程数
maxPoolSize 最大线程数
keepAliveTime 保持存活时间(非核心线程的存活时间)
workQueue 任务存储队列
threadFactory ThreadFactory 当线程池需要新的线程的时候,会使用threadFactory来生成新的线程
Handler RejectedExecutionHandler 由于线程池无法接受你所提交的任务的拒绝策略
TimeUnit unit: keepAliveTime的时间单位

corePoolSize指的是核心线程数:线程池在完成初始化后,默认情况下,线程池中并没有任何线程,线程池会等待有任务到来时,再创建新线程去执行任务
线程池有可能会再核心线程数的基础上,额外增加一些线程,但是这些新增加的线程数有一个上限,这就是最大量maxPoolSize

3、添加线程的规则

  • 如果线程数小于核心线程数(corePoolSize),即使其他工作线程处于空闲状态,也会创建一个新线程来运行新任务
  • 如果线程数等于(或大于)核心线程数(corePoolSize)但少于最大线程数(maximumPoolSize),则将任务放入队列
  • 如果队列已满,并且线程数小于最大线程数(maxPoolSize),则创建一个新线程来运行任务
  • 如果队列已满,并且线程数大于或等于最大线程数(maxPoolSize)中,则拒绝该任务
    在这里插入图片描述

4、工作队列

  • 无界队列:LinkedBlockingQueue
    是一个单向链表实现的阻塞队列,先进先出的顺序,支持多线程并发操作,可以认为是无界队列
    新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素

  • 有界队列:ArrayBlockingQueue
    一个由数组支持的有界队列,此队列按先进先出原则对元素进行排序
    新元素插入到队列的尾部,队列获取操作则是从队列头部开始获取元素
    这是一个简单的“有界缓存区”,一旦创建,就不能在增加其容量

  • 同步队列:SynchronousQueue
    一个没有内部容量的同步队列,(容量为0,无论何时,size方法总是返回0)
    每个插入操作必须等待另一个线程进行相应的删除操作,反之亦然
    put操作阻塞,直到另外一个线程取走队列的元素
    take操作阻塞,直到另外的线程put某个元素到队列中
    任何线程只能取得其他线程put进去的元素,而不会取到自己put进去的元素

5、JDK提供的线程池

  • newFixedThreadPool (固定大小的线程池,核心线程池数量和最大线程池数量相等且可以手动设置数量)
public static ExecutorService newFixedThreadPool(int nThreads){
	return new ThreadPoolExecutor(nThreads,nThreads,keepAliveTime:0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>())
}


public static ExecutorService newFixedThreadPool(int nThreads,ThreadFactory threadFactory){
	return new ThreadPoolExecutor(nThreads,nThreads,keepAliveTime:0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),threadFactory);
}

使用无界队列(LinkedBlockingQueue),容量没有上限,所以当请求数量越来越多,并且无法及时处理完毕的时候,也就是请求堆积的时候,会容易造成占用大量的内存,可能会导致OOM

  • newSingleThreadExecutor(单一线程池,核心线程池数量和最大线程池数量都为1)
public static ExecutorService newSingleThreadExecutor(){
	return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(corePoolSize:1,maximunPoolSize:1,keepAliveTime:0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()))
}

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory){
	return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(corePoolSize:1,maximunPoolSize:1,keepAliveTime:0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),threadFactory))
}
  • CachedThreadPool (核心线程数量为0,最大线程数量为Integer类型的最大值,使用同步队列)
public static  ExecutorService newCachedThreadPool(){
	return new ThreadPoolExecutor(corePoolSize:0,Integer.MAX_VALUE,keepAliveTime:60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>())
}


public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory){
	return new ThreadPoolExecutor(corePoolSize:0,Integer.MAX_VALUE,keepAliveTime:60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>(),threadFactory);
}
  • newScheduledThreadPool (核心线程数根据构造函数指定,最大线程数为Integer.MAX_VLAUE)
    ScheduledThreadPool是一个能实现定时、周期性任务的线程池。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }

public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }



public static ScheduledExecutorService newScheduledThreadPool(
            int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
    }


public ScheduledThreadPoolExecutor(int corePoolSize,
                                       ThreadFactory threadFactory) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue(), threadFactory);
    }

6、停止线程池的方法
shutdown:当执行完此方法后,不会立即停止线程,而是执行完已经创建好的线程再停止线程,如果再有新的线程加入,则会实行拒绝策略。

package ThreadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author yjx
 * @description
 * @date
 */
public class Shutdown {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            ShutDown1 shutDown1 = new ShutDown1();
            System.out.println(shutDown1);
            executorService.execute(shutDown1);
        }
        Thread.sleep(1500);
        executorService.shutdown();
        executorService.execute(new ShutDown1());
    }
}

class ShutDown1 implements Runnable{

    @Override
    public void run() {
        try {
            Thread.sleep(500);
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


pool-1-thread-1
pool-1-thread-10
pool-1-thread-9
pool-1-thread-7
pool-1-thread-8
pool-1-thread-6
pool-1-thread-5
pool-1-thread-4
pool-1-thread-3
pool-1-thread-2
    
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task ThreadPool.ShutDown1@6f94fa3e rejected from java.util.concurrent.ThreadPoolExecutor@5e481248[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 10]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
	at ThreadPool.Shutdown.main(Shutdown.java:21)

isShutdown:判断是否进入停止状态
在这里插入图片描述
isTerminated:判断所有的任务是否已经执行完,当所有的任务已经执行完后返回true,否则返回false

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

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

相关文章

重磅干货!一文读懂「企业级架构」

本文来自&#xff1a; 刘剑桥 极狐(GitLab) 高级解决方案架构师 首先来看两个真实的小故事&#xff1a; 1 小 A 公司有 50 人&#xff0c;作为运维人员&#xff0c;小 A 为公司搭建了一个私有化 GitLab 社区版。 某日&#xff0c;开发同学发现不能够访问 GitLab 了。小 A 查…

Web3中文|随着世界杯结束,web3体育可能达到800亿美元

随着卡塔尔世界杯的结束&#xff0c;Web3 Studios发布了一份对web3体育的深度报道。它声称该行业正处于发展拐点&#xff0c;到2030年其规模有可能达到800亿美元。 该报告数据贡献者来自Animoca Brands、FaceIt、ConsenSys、The Football Company、Apex Capital、Upland、Loot…

在Windows端使用XShell、WinSCP连接WSL2(win10的linux子系统/Ubuntu)

一、安装SSH服务 1、在ubuntu中输入: sudo apt-get install openssh-server 2、开启ssh服务 sudo service ssh start二、在Windows Subsystem for Linux &#xff08;WSL2&#xff09;中自动启动ssh服务 WSL2是Windows 10中提供的Linux子系统&#xff0c;基于Ubuntu内核。…

技术开发103

技术开发103 业务内容&#xff1a; 汽车音响等汽车电子部件试制、电子设备部件试制、精密钣金试制精密钣金试制 公司简介&#xff1a; 代表&#xff1a;中山尚美 成立时间&#xff1a;1950年6月 资本金&#xff1a;1000万日元 员工数&#xff1a;15名 资格认证/ S140001…

Python 实现将文本中数据批量写到Excel

欢迎小伙伴的点评✨✨&#xff0c;Python 常规应该开发系列&#xff0c;会渐进更新&#xff0c;如有需求&#xff0c;可留言&#x1f6d2;&#x1f6d2;&#x1f6d2;&#xff0c; 博主定当以每秒120赫兹的速度✈✈&#x1f685;&#x1f685;&#xff0c;写好博客。 文章目录前…

【408篇】C语言笔记-第十五章( 考研必会的查找算法考研真题实战)

文章目录第一节&#xff1a;顺序查找原理及实战1. 顺序查找原理解析2. 顺序查找代码实战第二节&#xff1a;折半查找原理及实战1. 折半查找原理解析2. 折半查找代码实战第三节&#xff1a;二叉排序树原理及建树实战1. 二叉排序树原理解析2. 二叉排序树代码实战第四节&#xff1…

Docker应用部署迁移备份DockerFile

文章标题一、应用部署1&#xff09;MySQL部署2&#xff09;Redis部署3&#xff09;Nginx部署二、迁移与备份1&#xff09;容器做成镜像2&#xff09;把镜像被分成压缩包三、DockerFile1&#xff09;基于Centos创建镜像自带Vim软件2&#xff09;制作Django项目镜像一、应用部署 …

计算机毕设Python+Vue学生学科竞赛管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【第十三章 MySQL管理(mysqladmin,mysqlbinlog,mysqlshow,mysqldump,mysqlimport/source)】

第十三章 MySQL管理&#xff08;mysqladmin,mysqlbinlog,mysqlshow,mysqldump,mysqlimport/source&#xff09; 1.系统数据库&#xff1a; Mysql数据库安装完成后&#xff0c;自带了以下四个数据库&#xff0c;具体作用如下&#xff1a; 2.mysql&#xff1a; 该mysql不是指mys…

计算机毕设Python+Vue学院校友信息管理系统的(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Promise(二) 关键问题+async+await

目录 1.几个关键问题 2. async函数 3. await表达式 4.async与await实践结合 5.async与await实践结合——发送Ajax请求获取信息 1.几个关键问题 在promise封装之前做准备 <script>let p new Promise((resolve, reject) > {//三种方式promise状态最开始是pending/…

【LeetCode】1760. 袋子里最少数目的球

袋子里最少数目的球 给你一个整数数组 nums &#xff0c;其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次&#xff1a; 选择任意一个袋子&#xff0c;并将袋子里的球分到 2 个新的袋子中&#xff0c;每…

媒体查询。

媒体查询( Media Query )是CSS3新语法 使用media查询&#xff0c;可以针对不同的媒体类型定义不同的样式 media 可以针对不同的屏幕尺寸设置不同的样式 当你重置浏览器大小的过程中&#xff0c;页面也会根据浏览的宽度和高度重新渲染页面 目前针对很多苹果手机、Android手机&am…

【算法】【字符串模块】字符串数组中两个字符之间的最短距离以及对hashcode以及equals的理解

目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介绍 …

来聊一聊|ConcurrentModificationException异常的解决

一. 前言 最近耀哥的一个学生&#xff0c;在使用使用ArrayList的subList的时候&#xff0c;发生了ConcurrentModificationException的异常。耀哥觉得这个现象非常具有代表性&#xff0c;估计有不少同学都会在同样的问题上犯迷糊&#xff0c;所以今天耀哥特意把这个问题记录下来…

设备台账管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;公告类型、公告信息、员工信息、仓库信息、设备类型、设备信息、供应商信息、采购信息、设备调拨、…

8个Spring事务失效的场景,你碰到过几种?

前言 作为Java开发工程师&#xff0c;相信大家对Spring种事务的使用并不陌生。但是你可能只是停留在基础的使用层面上&#xff0c;在遇到一些比较特殊的场景&#xff0c;事务可能没有生效&#xff0c;直接在生产上暴露了&#xff0c;这可能就会导致比较严重的生产事故。今天&a…

基于Android7 的msm8953芯片的nfc调试

目录 报错日志 NFC芯片重要的5个引脚 时序图分析 报错日志 01-01 19:05:22.570 0000 2341 2532 D NxpFwDnld: phDnldNfc_InitImgInfo:SUCCESS 01-01 19:05:22.570 0000 2341 2532 D NxpFwDnld: Processing Normal Sequence.. 01-01 19:05:22.570 0000 2341 2532 D NxpFwD…

干货|PCB电路板的组成、设计、工艺、流程及元器摆放和布线原则

大家对PCB电路板电路这个词很熟&#xff0c;有的了解PCB电路板的组成&#xff0c;有的了解PCB电路板的设计步骤&#xff0c;有的了解PCB电路板的制作工艺......但是对整个PCB电路板的组成、设计、工艺、流程及元器摆放和布线原则&#xff0c;及后期的注意事项没有一个综合的了解…

Spring 中 ConfigurationClassPostProcessor 类扫描解析之 @ComponentScan 解析

ConfigurationClassPostProcessor 简单概述 Spring 中类的解析是非常重要的&#xff0c;因为工程中有很多类&#xff0c;并且被一些注解修饰&#xff0c;比如&#xff1a;Component、Bean、Import、PropertySource、ImportSource、Scope 等。 你在类或者方法上标注这些注解&a…