JUC并发编程——线程池学习:基础概念及三大方法、七大参数、四大拒绝策略(基于狂神说的学习笔记)

线程池

池化技术的本质:事先准备好一些资源,线程复用,用完即还,方便管理

默认大小:2

最大并发数max 根据电脑去设置,CPU密集型,IO密集型

线程池的好处:

  • 降低资源的消耗
  • 提高响应的速度,无需新建和销毁
  • 方便管理

线程池学习:3大方法、7大参数、4大拒绝策略

三大方法

Executors.newSingleThreadExecutor(); // 单个线程
Executors.newFixedThreadPool(5); // 创建一个固定的线程池,此处线程池的大小为5
Executors.newCachedThreadPool();// 可变线程池

以下示例展示了开辟线程池的三个方法,以及如何用线程池的方法创建线程

package pool;import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;// 三大方法
// 使用线程池,要使用线程池来创建线程
public class Demo01 {public static void main(String[] args) {// ExecutorService threadPool = Executors.newSingleThreadExecutor(); // 单个线程// ExecutorService threadPool = Executors.newFixedThreadPool(5); // 创建一个固定的线程池,此处线程池的大小为5ExecutorService threadPool = Executors.newCachedThreadPool();// 可变线程池try {for (int i = 0; i < 10; i++) {// execute 是线程池的执行方法,其中传入一个线程,可以用lambda表达式写run方法threadPool.execute(()->{System.out.println(Thread.currentThread().getName());});}} catch (Exception e) {throw new RuntimeException(e);} finally {// 线程池用完,程序结束,需要关闭线程池threadPool.shutdown();}}
}

Executors.newSingleThreadExecutor();的执行结果如下:

在这里插入图片描述

Executors.newFixedThreadPool(5);的执行结果如下:

在这里插入图片描述

Executors.newCachedThreadPool(); 的执行结果如下:
在这里插入图片描述

七大参数

源码分析:

//Executors.newSingleThreadExecutor()源码public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}// Executors.newFixedThreadPool(5) 源码public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}// Executors.newCachedThreadPool() 源码public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}/***  可以发现,三大方法中,无论哪一个方法,实际上都调用了ThreadPoolExecutor方法* 所以本质上:三大方法是ThreadPoolExecutor方法的不同参数结果
*/// ThreadPoolExecutor 源码   可以发现,该方法,有7个参数
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.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;
}

corePoolSize:核心线程永远开着,时时刻刻看可以使用

maximumPoolSize:线程池最大容量(线程池并非时时刻刻所有线程都开启的,时时刻刻一直开启的只有核心线程),当阻塞队列已满,线程池还有未开启线程时,线程池将会开启未启动的线程

keepAliveTime:当非核心线程在一定时间内都未被使用,则非核心线程池将关闭,也就是线程池释放。(等待超时)

unit:超时单位

workQueue:阻塞队列

threadFactory:线程工厂,创建线程,一般不动

handler:拒绝策略,当线程池中所有线程都在工作,且阻塞队列已满时,再进入的获取线程的请求的处理方法

手动创建一个线程池

ExecutorService threadPool = new ThreadPoolExecutor(2,5,3,TimeUnit.SECONDS,new LinkedBlockingQueue<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy()
);
public class Demo01 {public static void main(String[] args) {// 自定义线程池!工作 ThreadPoolExecutor// 自定义线程池的最大承载量为: blockingQueue + maxExecutorService threadPool = new ThreadPoolExecutor(2,5,3,TimeUnit.SECONDS,new LinkedBlockingQueue<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());try {for (int i = 0; i < 10; i++) {// execute 是线程池的执行方法,其中传入一个线程,可以用lambda表达式写run方法threadPool.execute(()->{System.out.println(Thread.currentThread().getName());});}} catch (Exception e) {throw new RuntimeException(e);} finally {// 线程池用完,程序结束,需要关闭线程池threadPool.shutdown();}}
}

在上述例子中,因为for循环开启了10个线程,大于线程池的最大承载量(5+3=8),如果线程处理速度不够快,在最大承载量到达之前又来了请求,则会触发拒绝策略,而AbortPolicy()拒绝策略则是,当超过线程池最大承载量时,则会放弃之后请求,并抛出异常。

4大拒绝策略

在这里插入图片描述

  • AbortPolicy(): 拒绝请求,并抛出异常

  • CallerRunsPolicy():当线程池达到其最大容量并且所有工作线程都在忙的情况下,新的任务将被执行。CallerRunsPolicy策略意味着当调用线程池中的execute()方法来提交新任务时,如果线程池已经关闭或者达到饱和(即没有多余的线程可以处理新任务),那么新任务将在调用execute()方法的线程中直接执行。

    请注意,如果调用线程池的线程是主线程,这可能会导致主线程阻塞,直到任务完成。

  • DiscardPolicy:拒绝请求,但不抛出异常,进程正常运行

  • discardOldestPolicy();丢弃队列中最老的任务(即最早进入队列的任务),然后新任务将被加入队列。不会抛出异常

    请注意,这种策略可能会导致一些任务被丢弃,因此在使用时要特别注意。此处说明,丢弃最老的任务是指该任务直接被放弃,不会被重新执行,因此,在该策略中,有可能导致某些任务因被打断而无法完成

小结和拓展

  • 最大线程数到底该如何定义

    • CPU密集型, 根据CPU的核数来定义,几核CPU就开几核,可以保持CPU的效率最高
      Runtime.getRuntime().availableProcessors(); // 获取当前电脑的核数
    
    • IO密集型 判断程序中IO耗时特别大的线程的数量,最大线程数大于该数量即可

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode - 319. Bulb Switcher

Description There are n bulbs that are initially off. You first turn on all the bulbs, then you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it’s off or turning off if it’s on). For the ith round, you toggl…

中文编程开发语言工具编程实际案例:美发店会员管理系统软件编程实例

中文编程开发语言工具编程实际案例&#xff1a;美发店会员管理系统软件编程实例 中文编程开发语言工具编程实际案例&#xff1a;美发店会员管理系统软件编程实例。 软件功能&#xff1a; 1、系统设置&#xff1a;参数设定&#xff0c;账号及权限设置&#xff0c;系统初始化&a…

es6(三)——常用es6(函数、数组、对象的扩展)

ES6的系列文章目录 第一章 Python 机器学习入门之pandas的使用 文章目录 ES6的系列文章目录0、数值的扩展一、函数的扩展1、函数的默认值2、函数的reset参数 二、数组的扩展1. 将对象转成数组的Array.from()2. 将对象转成数组的Array.from()3. 实例方法 find()&#xff0c;fin…

Jmeter性能测试:高并发分布式性能测试

一、为什么要进行分布式性能测试 当进行高并发性能测试的时候&#xff0c;受限于Jmeter工具本身和电脑硬件的原因&#xff0c;无法满足我们对大并发性能测试的要求。 基于这种场景下&#xff0c;我们就需要采用分布式的方式来实现我们高并发的性能测试要求。 二、分布式性能…

Hadoop3教程(二十五):Yarn的多队列调度器使用案例

文章目录 &#xff08;136&#xff09;生产环境多队列创建&好处&#xff08;137&#xff09;容量调度器多队列提交案例如何创建多个队列如何向指定队列提交任务 &#xff08;138&#xff09;容量调度器任务优先级&#xff08;139&#xff09;公平调度器案例参考文献 &#…

高校教务系统登录页面JS分析——华东交通大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

使用 VS Code 作为 VC6 的编辑器

使用 VS Code 作为 VC 6.0 的编辑器 由于一些众所周知的原因&#xff0c;我们不得不使用经典&#xff08;过时&#xff09;的比我们年龄还大的已有 25 年历史的 VC 6.0 来学习 C 语言。而对于现在来说&#xff0c;这个经典的 IDE 过于简陋&#xff0c;并且早已不兼容新的操作系…

跨境商城源码部署(无货源模式,多语言,多货币)

在互联网发展的背景下&#xff0c;跨境电商成为了全球贸易的重要形式之一。跨境商城源码部署是指将跨境电商平台的源代码部署到服务器上&#xff0c;以便搭建一个完整的跨境商城网站。通过部署源码&#xff0c;可以实现无货源模式、多语言和多货币等功能&#xff0c;为用户提供…

Word标题编号转换为纯文本

一、创建宏 这个要用到宏命令 打开Word文档&#xff0c;按下快捷键AltF8&#xff0c;在“宏名”栏中输入“编号转换为文本”&#xff0c;这是给它起的名字&#xff0c;然后点击“创建”在新打开的窗口上&#xff0c;你会看到光标在闪烁&#xff0c;把下面函数中的4行内容复制粘…

机器学习中参数优化调试方法

1 超参数优化 调参即超参数优化&#xff0c;是指从超参数空间中选择一组合适的超参数&#xff0c;以权衡好模型的偏差(bias)和方差(variance)&#xff0c;从而提高模型效果及性能。常用的调参方法有&#xff1a; 人工手动调参 网格/随机搜索(Grid / Random Search) 贝叶斯优…

[python 刷题] 19 Remove Nth Node From End of List

[python 刷题] 19 Remove Nth Node From End of List 题目&#xff1a; Given the head of a linked list, remove the nth node from the end of the list and return its head. 题目说的是就是移除倒数第 n 个结点&#xff0c;如官方给的案例&#xff1a; 这里提供的 n 就是…

运筹优化 | 分支定界算法(Branch and Bound)Python求解整数规划

from gurobipy import * import copy import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei]定义了一个线性松弛问题&#xff0c;并用Gurobi求解 initial_LP Model(initial LP) # 定义变量initial_LP&#xff0c;调用Gurobi的Model&…

SVN一直报错Error running context: 由于目标计算机积极拒绝,无法连接。解决办法【杭州多测师_王sir】...

一、发现SVN一直报错Error running context: 由于目标计算机积极拒绝&#xff0c;无法连接。 二、没有启动 VisualSVN Server。cmd--> services.msc打开本地服务。查看VisualSVN的三个服务的启动类型&#xff0c;建议选择“手动”&#xff0c;不能选择“禁用”&#xff0c;选…

电脑办公助手之桌面便签,助力高效率办公

在现代办公的快节奏中&#xff0c;大家有应接不暇的工作&#xff0c;每天面对着复杂的工作任务&#xff0c;总感觉时间不够用&#xff0c;而且工作无厘头。对于这种状态&#xff0c;大家可以选择在电脑上安装一款好用的办公便签软件来辅助日常办公。 敬业签是一款专为办公人士…

【Release】Photoshop ICO file format plug-in 3.0

【Introduction】 The Photoshop ICO plug-in is a file format plug-in developed for Photoshop, which allows Photoshop to directly read and write ICO format files. Because Photoshop has powerful pixel bitmap editing functions, it has many users and a good us…

“构建交互式用户界面的自定义组件应用与界面布局设置“

目录 引言自定义组件应用设置界面布局投票界面布局及实现投票选项界面总结 引言 在软件开发中&#xff0c;用户界面设计是至关重要的一环。良好的界面设计可以提升用户体验、增加用户黏性&#xff0c;并提高软件的易用性。本篇博客将介绍如何利用自定义组件应用和界面布局设置…

了解 AI :了解 AI 方面的一些术语 (中英文对照)

本心、输入输出、结果 文章目录 了解 AI &#xff1a;了解 AI 方面的一些术语 &#xff08;中英文对照&#xff09;前言AI 方面的一些术语 &#xff08;中英文对照&#xff09;AI 方面的一些术语 &#xff08;中英文对照&#xff09; - 文字版弘扬爱国精神 了解 AI &#xff1a…

PowerShell系列(十二):PowerShell Cmdlet高级参数介绍(二)

目录 1、ErrorVariable 错误变量 2、OutVariable 结果输出 3、OutBuffer 输出Buffer定义 4、PipelineVariable管道参数 今天给大家讲解PowerShell Cmdlet高级参数第二部分相关的知识&#xff0c;希望对大家学习PowerShell能有所帮助&#xff01; 1、ErrorVariable 错误变量…

浏览器缓存

浏览器的缓存是性能优化中最高效的方法看&#xff0c;他可以显著减少网络传输带来的损耗。 浏览器缓存可以帮助以下两种情况下进行优化&#xff1a; 发起请求&#xff1a;使用缓存不发起的请求浏览器响应&#xff1a;后端与前端数据是一致的&#xff0c;那么没有必要再将数据传…

网络安全内网渗透之信息收集--systeminfo查看电脑有无加域

systeminfo输出的内容很多&#xff0c;包括主机名、OS名称、OS版本、域信息、打的补丁程序等。 其中&#xff0c;查看电脑有无加域可以快速搜索&#xff1a; systeminfo|findstr "域:" 输出结果为WORKGROUP&#xff0c;可见该机器没有加域&#xff1a; systeminfo…