线程池(通俗易懂)

article/2025/9/10 8:41:08

目录

一、什么是线程池

二、创建线程池的方式

三、线程池的七大参数

 四、四种拒绝策略

1.AbortPolicy()

2.CallerRunsPolicy()

3.DiscardPolicy()

4.DiscardOldestPolicy()

五、自定义一个线程池

1.场景描述

 2.代码实现


一、什么是线程池

        线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象。

线程池的优点:降低资源消耗、提高响应速度、方便管理;线程可以复用、可以控制最大并发数、可以管理线程

二、创建线程池的方式

方式描述
Executors.newSingleThreadExecutor();创建一个单一的线程池
 Executors.newFixedThreadPool(int nThreads);创建一个固定大小的线程池,参数填线程池大小
 Executors.newCachedThreadPool();创建一个可伸缩的线程池,遇强则强,遇弱则弱
public class ThreadPoolTest {public static void main(String[] args) {ExecutorService threadPool = Executors.newSingleThreadExecutor(); //ExecutorService threadPool = Executors.newFixedThreadPool(5);//ExecutorService threadPool = Executors.newCachedThreadPool();try {for (int i = 1; i <= 10; i++) {//在execute中丢入一个Runnable --->  lambda 表达式threadPool.execute(()->{System.out.println(Thread.currentThread().getName());});}} catch (Exception e) {e.printStackTrace();} finally {//使用完毕后,程序结束,关闭线程池threadPool.shutdown();}}
}

三、线程池的七大参数

参数描述
int corePoolSize核心线程池大小
int maximumPoolSize最核心大线程池大小
long keepAliveTime超时时间 没有人使用会自动释放
TimeUnit unit超时单位
BlockingQueue<Runnable> workQueue阻塞队列
ThreadFactory threadFactory线程工厂,创建线程的,一般不用动
RejectedExecutionHandler handler拒绝策略

 在上面线程池的三种创建方式种中,点进源码,可以看到它们都new 了一个 ThreadPoolExecutor

//newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, //核心线程,最大线程为 10L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}
//newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads, //核心线程,最大线程为传进来的参数0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}
//newCachedThreadPool
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,//核心线程默认是0,最大线程为21亿60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}

 ThreadPoolExecutor 中就包含了线程池的七大参数

// ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,   //核心线程池大小int maximumPoolSize,  //最核心大线程池大小long keepAliveTime, //超时时间 没有人使用会自动释放TimeUnit unit,   // 超时单位BlockingQueue<Runnable> workQueue,  // 阻塞队列ThreadFactory threadFactory,  // 线程工厂,创建线程的,一般不用动RejectedExecutionHandler handler// 拒绝策略) {if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0)throw new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw new NullPointerException();this.acc = System.getSecurityManager() == null ?null :AccessController.getContext();this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;}

 四、四种拒绝策略

拒绝策略描述
new ThreadPoolExecutor.AbortPolicy() 线程池默认拒绝策略,如果元素添加到线程池失败,会抛出RejectedExecutionException异常
new ThreadPoolExecutor.CallerRunsPolicy() 如果添加失败,那么主线程会自己调用执行器中的execute方法来执行任务 
new ThreadPoolExecutor.DiscardPolicy()如果添加失败,则放弃,不会抛出异常        
new ThreadPoolExecutor.DiscardOldestPolicy()如果添加到线程池失败,会将队列中最早添加的元素移除,再尝试添加,如果失败则按该策略不断重试

场景见下面的自定义线程池:核心线程数-2;最大核心线程数 - 5;阻塞队列 - 3 可容纳最大请求数 - 8  

1.AbortPolicy()

分别将请求数设置为5,8,9

2.CallerRunsPolicy()

 将请求数量设置为9,不超过最大容量的情况都相同

3.DiscardPolicy()

 将请求数量设置为9,不超过最大容量的情况都相同

4.DiscardOldestPolicy()

 将请求数量设置为9,不超过最大容量的情况都相同

新请求把旧请求顶替

 

 

五、自定义一个线程池

1.场景描述

银行办理业务

平时银行只开放两个办理业务窗口,当两个窗口都有人时,新来的客户会进入侯客厅等待,当人过多时3,4,5窗口会打开进行业务办理

 其实这种场景就与线程池类似,如下图:

 2.代码实现

public class ManualPool {public static void main(String[] args) {ExecutorService threadPool = new ThreadPoolExecutor(2,  //核心线程池大小5,  //最大核心线程池大小3,  //超时时间TimeUnit.SECONDS,  //超时单位new LinkedBlockingQueue<>(3), //阻塞队列 -->  相当于银行的候客区Executors.defaultThreadFactory(), //线程工厂new ThreadPoolExecutor.DiscardOldestPolicy() //拒绝策略);try {//最大容量 = 阻塞队列大小 + 最大核心线程池大小for (int i = 1; i <= 9; i++) {//在execute中丢入一个Runnable --->  lambda 表达式//使用线程池来创建线程threadPool.execute(()->{System.out.println(Thread.currentThread().getName());});}} catch (Exception e) {e.printStackTrace();} finally {//使用完毕后,程序结束,关闭线程池threadPool.shutdown();}}
}

 


http://chatgpt.dhexx.cn/article/jqtwaNrm.shtml

相关文章

线程池研发学习笔记

线程池研发 线程池 线程池基础 概念介绍 1:什么是线程池 可以直接叙述,也可以对比连接池介绍 线程池其实就是一种多线程处理形式&#xff0c;处理过程中可以将任务添加到队列中&#xff0c;然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是…

线程池是什么?线程池(ThreadPoolExecutor)使用详解

点一点&#xff0c;了解更多https://www.csdn.net/ 本篇文章将详细讲解什么是线程池&#xff0c;线程池的参数介绍&#xff0c;线程池的工作流程&#xff0c;使用Executors创建常见的线程池~~~ 目录 点一点&#xff0c;了解更多 文章目录 一、线程池的概念 1.1线程池的目的…

写给小白看的线程池,还有10道面试题

如何搞定20k的面试小抄 为什么要用线程池呢&#xff1f; 下面是一段创建线程并运行的代码: for (int i 0; i < 100; i) {new Thread(() -> {System.out.println("run thread->" Thread.currentThread().getName());userService.updateUser(....);}).start…

线程池详解(通俗易懂超级好)

目标 【理解】线程池基本概念 【理解】线程池工作原理 【掌握】自定义线程池 【应用】java内置线程池 【应用】使用java内置线程池完成综合案例 线程池 线程池基础线程池使用线程池综合案例学员练习线程池总结 概念介绍 什么是线程池为什么使用线程池线程池有哪些优势 什么…

Java 多线程:彻底搞懂线程池

熟悉 Java 多线程编程的同学都知道&#xff0c;当我们线程创建过多时&#xff0c;容易引发内存溢出&#xff0c;因此我们就有必要使用线程池的技术了。 目录 1 线程池的优势 2 线程池的使用 3 线程池的工作原理 4 线程池的参数 4.1 任务队列&#xff08;workQueue&#x…

GridView概述

一、使用GridView以表格形式显示多张图片 GridView用于在界面上按行、列分布的方式来显示多个组件 二、使用GridView 1、java代码 import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterV…

Master-Detail GridView

梦幻版Master-Detail GridView(黄忠成) 2007-12-26 09:34 前面的Master-Detail GridView控件應用&#xff0c;相信你已在市面上的書、或網路上見過&#xff0c;但此節中的GridView控件應用包你沒看過&#xff0c;但一定想過&#xff01;請見圖4-8-63。 圖4-8-63 圖 4-8-64 你一…

GridView DataGrid

ASP.NET 2.0提供了功能强大的数据绑定控件GridView、在使用中&#xff0c;一些属性和方法经常会与ASP.NET 1.1中的DataGrid混淆(VS2005中依然可以使用DataGrid&#xff0c;手动添加到工具箱或HTML状态输入代码)&#xff0c;下面我们分别用GridView和DataGrid实现其数据绑定、编…

GridView详讲

GridView是ASP.NET界面开发中的一个重要的控件&#xff0c;对GridView使用的熟练程度直接影响软件开发的进度及功能的实现。(车延禄) GridView的主要新特性&#xff1a; 1.与DataSource控件结合实现了显示与数据操作的分离&#xff0c;大大减化了代码的编写量; 2.实现"双向…

GridView详述

GridView无代码分页排序GridView选中&#xff0c;编辑&#xff0c;取消&#xff0c;删除GridView正反双向排序GridView和下拉菜单DropDownList结合GridView和CheckBox结合鼠标移到GridView某一行时改变该行的背景色方法一鼠标移到GridView某一行时改变该行的背景色方法二GridVi…

GridView、ListView、Adapter、Map、HashMap

1.ListView自定义适配器adapter 注&#xff1a;Android适配器是数据和视图之间的桥梁&#xff0c;以便于数据在View上显示。适配器就像显示器&#xff0c;把复杂的东西按人可以接受的方式来展现。 &#xff08;1&#xff09;首先将适配器的View视图表现出来&#xff0c;使用L…

GridViewPager

GridViewPager ViewPager结合GridView&#xff0c;轻松实现类似表情面板的控件。可自由定制Item布局&#xff0c;提供充足的自定义参数等。也处理了条目点击事件和条目长按事件。效果如下&#xff1a; Demo下载地址&#xff1a;GridViewPager &#xff0c;或者扫描以下二维码…

libevent 编译

1.下载源码 github:https://github.com/libevent/libevent 官网&#xff1a;http://libevent.org/ 2.CMake 编译 在libevent源码目录建立文件夹&#xff1a;BuildVs2010_x64 2.打开CMake 3.BuildVs2010_x64 下此时生成了vs2010的解决方案。然后编译生成就ok NOTE&#x…

13、《Libevent中文帮助文档》学习笔记13:Linux下集成、运行libevent

Linux下编译libevent的指导可以参考《4、《Libevent中文帮助文档》学习笔记4&#xff1a;Linux下编译libevent》&#xff0c;完成编译、安装&#xff0c;生成so库后&#xff0c;其他程序即可依赖libevent的so库&#xff0c;使用libevent的功能。 由于没有通过prefix指定安装路…

libevent 编译与安装 (WIN10 visual studio2019, ubuntu,centos)

文章目录 一、准备安装包二、编译与安装编译zlib编译openssl编译libevent 三、libevent集成zlib测试程序修改编译&#xff08;可选&#xff09;四、测试程序五、linux(ubuntu)测试安装依赖环境&#xff0c;依次编译zlib,openssl,libeventwindows与linux共享文件夹&#xff08;使…

Libevent 学习一:Libevent 源码编译

文章目录 Libevent 学习一&#xff1a;Libevent 源码编译Libevent Windows 编译Windows 编译环境安装 Visual Studio Community 2015安装 zlib安装 OpenSSL安装 Libeventcmake 安装 LibeventLibevent 测试程序 Libevent Linux编译CentOS 7 安装 LibeventLibevent 测试程序 Libe…

libevent mysql_libevent安装总结

1.先用&#xff1a;ls -al /usr/lib | grep libevent 查看是否已安装&#xff1b;如果已安装且版本低于1.3&#xff0c;则先通过&#xff1a;rpm -e libevent —nodeps进行卸载。 2.下载libevent安装包&#xff1a;libevent-2.0.18-stable.tar.gz。 wget https://github.com/do…

在window用vcpkg安装libevent

参考readme https://github.com/microsoft/vcpkg/blob/master/README_zh_CN.md 使用的PackageManager方式安装&#xff0c; Package Managers 下载 vcpkg 依赖管理包 git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.bat ./vcpkg integrate…

libevent实践01:准备源码、搭建项目、编译脚本和入门例子

编译源码 libevent是一个Reactor事件库。 我的理解&#xff0c;就是封装了select、epoll、poll的函数库。有使用select&#xff0c;poll&#xff0c;epoll的需求就可以使用的。 官网地址&#xff1a;https://libevent.org/ 下载源码&#xff1a; https://github.com/libev…

libevent(1)windows下安装libevent

Socket通信库libevent成熟、稳定、性能高&#xff0c;在unix和windows下都能使用&#xff0c;在证券交易领域也有不少成功的应用&#xff0c;已经用事实证明是非常棒的socket通信库。对我们目前交易系统的unix重构来说&#xff0c;是比较合适的选择 –– 坑少、在证券交易项目中…