线程池个人笔记总结

news/2024/9/24 17:13:08/
线程池的创建示例
@Override@Bean(name = "threadPool")public ThreadPoolTaskExecutor getAsyncExecutor() {ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();// 设置核心线程数threadPool.setCorePoolSize(10);// 设置最大线程数threadPool.setMaxPoolSize(20);// 线程池所使用的缓冲队列threadPool.setQueueCapacity(10000);// 等待任务在关机时完成--表明等待所有线程执行完threadPool.setWaitForTasksToCompleteOnShutdown(true);// 线程池关闭的等待时间(默认为0)threadPool.setAwaitTerminationSeconds(60*5);// 非核心线程空闲的存活时间threadPool.setKeepAliveSeconds(1);// 线程名称前缀threadPool.setThreadNamePrefix("newton-thread-");// 线程池拒绝策略threadPool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 初始化线程threadPool.initialize();return threadPool;}
线程池参数解释
KeepAliveTime是什么,有什么用

我们设置的KeepAliveTime的时间是非核心线程空闲的存活时间,如果超过存活时间则会被销毁目的为了节省系统资源

拒绝策略的触发条件

当任务队列已满并且线程池中的线程数达到最大线程数时,新提交的任务就会触发拒绝策略

任务队列什么时候有数据

只有当线程池的使用线程数达到最大线程数时(包括核心和非核心线程数),此时新的任务才会进入任务队列等待执行

核心线程和非核心线程有什么区别

首先他们运行速度没有区别,行速度取决于CPU的调度和处理能力,以及任务本身的复杂性和计算量,他们区别主要在核心线程不会被销毁,除非线程池关闭,非核心线程是达到一定条件额外创建的,并且超过设置的存活时间会被销毁来回收系统资源。

线程池执行流程
  • 先判断核心线程是否满了,如果没满就创建核心线程执行任务
  • 如果核心线程满了,判断最大线程是否满了,如果没满,就创建非核心线程执行任务
  • 判断非核心线程是否超过存活时间,如果超过,就销毁这个线程
  • 如果线程池中的使用的线程数达到最大线程数,新的任务就会进入等待队列
  • 如果等待队列满了和线程池都满了,则调用拒绝策略
线程池拒绝策略
AbortPolicy(默认策略):

抛出RejectedExecutionException异常,表示拒绝执行新任务。

CallerRunsPolicy:

将任务返回给调用线程执行,如果线程池已关闭,则丢弃任务。

DiscardPolicy:

默默丢弃无法处理的任务,不给予任何处理。

DiscardOldestPolicy:

丢弃任务队列中等待时间最久的任务,然后将新任务加入队列。

自定义拒绝策略

一般需要实现RejectedExecutionHandler接口。以下是一个自定义的拒绝策略示例:

import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 自定义拒绝策略,例如记录日志或将任务加入队列等System.err.println("Task rejected. " + r.toString());}
}

然后可以在创建线程池时使用自定义拒绝策略:

ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS,new ArrayBlockingQueue<>(queueCapacity), new CustomRejectedExecutionHandler());
线程池常用方法
shutdown

shutdown() 方法会优雅地关闭线程池,等待已提交的任务执行完成(可以设置最长等待时间),不再接受新任务。

shutdownNow

shutdownNow() 会先改状态为STOP不接收新的任务,并尝试取消正在执行的任务,立即关闭线程池 并返回未执行的任务列表

CountDownLatch

CountDownLatch是一种倒计时锁,允许一个或多个线程等待其他线程执行完毕才运行

// 创建countDownLatch 数量为线程数
CountDownLatch countDownLatch = new CountDownLatch(10);
for (int i = 1; i <= maxPage; i++) {executor.execute(() -> {try{// 开线程执行业务逻辑xxx}catch{} finally {// 执行完一个线程任务就在finally中进行减1countDownLatch.countDown();}});
}
// 等待所有子线程执行完毕前会一直阻塞
countDownLatch.await();
// 后续主线程任务
xxx
setDefaultUncaughtExceptionHandler

用于为所有新创建的线程设置默认的未捕获异常处理器


http://www.ppmy.cn/news/1507392.html

相关文章

ffmpeg 命令图片和视频转换

1、截图 ffmpeg -i d:\input.mp4 -ss 0:0:10 d:\output.jpg //指定输出分辨率 ffmpeg -i d:\input.mp4 -y -f image2 -ss 0:0:10 -vframes 1 -s 640x360 d:\output.jpg 2、视频分拆图片 ffmpeg -r 输入帧率 -i d:\input.mp4 -r 输出帧率 "d:\outputDir\frame_%04d.jp…

【网络】IP和MAC地址的映射——ARP协议和ARP欺骗概述

目录 引言 ARP的工作机制 ARP欺骗 ARP欺骗的断网行为 ARP欺骗成为中间人 工具介绍 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 同一子网内不同主机用数据链路层的MAC地址来寻址&#xff0c;而不是子网内的私有IP&#xff08;网络层&#xff09;。数据包中的IP…

html5宠物网站模板源码

文章目录 1.设计来源1.1 主界面1.2 主界面菜单1.3 关于我们界面1.4 宠物照片墙界面1.5 宠物博客界面1.6 宠物服务界面1.7 宠物团队界面1.8 联系我们界面 2.效果和源码2.1 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 【博主推荐】&a…

Elasticsearch 地理查询:高效探索空间数据

在地理信息系统&#xff08;GIS&#xff09;和基于位置的服务中&#xff0c;地理查询扮演着核心角色。Elasticsearch 提供了一套丰富的地理查询功能&#xff0c;允许用户根据地理位置对数据进行检索。本文将介绍 Elasticsearch 中地理查询的基本概念&#xff0c;并展示如何使用…

Lambda表达式和Stream流执行流程

两个参数Lambda 表达式 两个参数的 Lambda 表达式使用&#xff0c;当函数体/方法体中只有一个return语句时&#xff0c;return和大括号都可以省略。 package com.wlx.day17;import org.junit.Test;import java.util.ArrayList; import java.util.Collections; import java.ut…

【若依前端文本框传输富文本标签报错,被拦截】

修改admin模块中yal文件中xss攻击配置 使用,拼接&#xff0c;填的值为Controller访问路径

开源免费前端地图开发组件xdh-map

xdh-map是一个基于Openlayers的地图应用Vue组件&#xff0c;具有多方面的功能和特点。以下是对xdh-map的详细介绍&#xff1a; 一、功能与特性 内置多种地图瓦片&#xff1a;xdh-map内置了百度、高德、天地图等地图瓦片&#xff0c;使得开发者可以方便地在应用中集成多种地图…

Leetcode热题100||150:链表

206、反转链表 struct ListNode* reverseList(struct ListNode* head) {struct ListNode* prev NULL;struct ListNode* curr head;while (curr) {struct ListNode* next curr->next;curr->next prev;prev curr;curr next;}return prev; }234、回文链表 经典的找中…