线程池(重点)

news2024/11/16 21:34:28

1.线程池的三大方法

package com.kuang.pool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//Executors工具类  三大方法
//使用线程池,创建线程
public class Demo01 {
    public static void main(String[] args) {
//        ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程。
       //ExecutorService threadPool = Executors.newFixedThreadPool(5);// 创建一个固定的线程池的大小。阻塞队列无线大,创建线程固定
        ExecutorService threadPool = Executors.newCachedThreadPool();//创建一个可伸缩的,遇强则强,遇弱则弱。 创建线程无线大,阻塞队列就一个容量

        try {
            for (int i = 0; i < 100; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }



    }
}

2.源码分析

2.1 newSingleThreadExecutor() 

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

2.2 newFixedThreadPool(int nThreads)

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

2.3 newCachedThreadPool()

  public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
本质是:new 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;
    }
public ThreadPoolExecutor(int corePoolSize,//核心线程池大小
                          int maximumPoolSize,//最大核心线池大小
                          long keepAliveTime,//超时了没有人调用就会释放
                          TimeUnit unit,//超时单位
                          BlockingQueue<Runnable> workQueue,//阻塞队列
                          ThreadFactory threadFactory,//线程工厂,创建线程的,一般不用动
                          RejectedExecutionHandler handler) {// 拒绝策略
 

 手动 创建一个线程池 

       new

4种拒绝策略

package com.kuang.pool;

import java.security.AccessController;
import java.util.concurrent.*;

import static java.util.concurrent.Executors.newSingleThreadExecutor;

//Executors工具类  三大方法
//使用线程池,创建线程

/**
 * 第一种拒绝策略  new ThreadPoolExecutor.AbortPolicy() 超出,则不去执行那个多的,而且会抛异常RejectedExecutionException
 * 第二种拒绝策略 new ThreadPoolExecutor.CallerRunsPolicy() 哪个线程的创建出的这个线程,就回到哪个线程去执行
 *  第三种拒绝策略  new ThreadPoolExecutor.DiscardPolicy() 队列满了 丢掉任务, 不去执行,也不抛异常
 * 第四种拒绝策略 new ThreadPoolExecutor.DiscardOldestPolicy()   队列满了,会抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务添加进去。也不会抛异常!!!
 *
 */
public class Demo01 {
    public static void main(String[] args) {
//        ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程。
       //ExecutorService threadPool = Executors.newFixedThreadPool(5);// 创建一个固定的线程池的大小。阻塞队列无线大,创建线程固定
//        ExecutorService threadPool = Executors.newCachedThreadPool();//创建一个可伸缩的,遇强则强,遇弱则弱。 创建线程无线大,阻塞队列就一个容量
        ExecutorService threadPool = new ThreadPoolExecutor(2
                , 5,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()//银行满了,还有人进来,不处理这个人的,抛出异常.
        );

        try {
            //最大承载: Deque+max =5+3=8
            //超过 RejectedExecutionException
            for (int i =1; i <=9; i++) {
                int finalI = i;
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" ok"+ finalI);
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }



    }





}

3. 最大线程到底该如何定义(调优)

1、CPU密集型  CPU的内核为几, 最大线程就定义为几,可以保持CPU的效率最高!

代码获取CPU的核数 

System.out.println("CPU核心为:"+Runtime.getRuntime().availableProcessors());

2、IO密集型  判断 你程序中十分耗IO的线程  就把最大线程定义 >15   比如

程序 15 个大型任务,io十分占用资源,就设置最大线程定义为30

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

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

相关文章

RHCSA_Linux 从命令行管理文件

目录 一、文件命令规范&#xff1a; 二、创建链接文件 1、创建软链接文件 2、创建硬链接文件 三、目录操作命令 1、创建目录 -- mkdir 2、统计目录及文件的空间占用情况 -- du 3、删除目录文件 四、创建、删除普通文件 1、创建普通文件 2、删除普通文件 五、数据流和…

春秋云镜 CVE-2010-1870/CVE-2013-1965

春秋云镜 CVE-2010-1870 S2-005 远程代码执行漏洞 靶标介绍 struts2将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象&#xff0c;struts框架通过过滤#字符防止安全问题&#xff0c;然而通过unicode编码(u0023)或8漏洞(43)即绕过…

【项目经验】:elementui多选表格默认选中

一.需求 在页面刚打开就默认选中指定项。 二.方法Table Methods toggleRowSelection用于多选表格&#xff0c;切换某一行的选中状态&#xff0c;如果使用了第二个参数&#xff0c;则是设置这一行选中与否&#xff08;selected 为 true 则选中&#xff09;row, selected 详细…

Docker部署单点Elasticsearch与Kibana

一 、 创建网络 因为需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里创建一个网络&#xff1a; docker network create es-net # 创建一个网络名称为:es-net 二 、拉取并加载镜像 方式一 docker pull elasticsearch:7.12.1 版本为elasticsearch的7…

线性代数基础-矩阵

八、矩阵的基础概念 1.矩阵 我们忘掉之前行列式的一切&#xff0c;列一种全新的数表&#xff0c;虽然长得很像&#xff0c;但是大不相同&#xff0c;首先一个区别就是矩阵不能展开成一个值&#xff0c;这里不讨论矩阵的空间意义 { a 11 x 1 a 12 x 2 a 13 x 3 . . . a 1…

CH573-09-BLE蓝牙安卓应用二次开发——RISC-V内核BLE MCU快速开发教程

一、基础工程搭建 在上一章最后一讲的BLE蓝牙例程中&#xff0c;我们使用了沁恒官方的BLE调试助手完成数据发送&#xff0c;接下来我们使用Android Studio完成一款简易的BLE调试助手。 1、参考文章 我这里参考了CSDN中的一位博主“摸爬滚打的程序媛”的文章以及对应文章中的…

2023最新玩客云刷机armbian,部署docker并配置各种常用容器镜像

#以下安装从基于 rootonecloud:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy刷机开始 &#xff08;以下刷机教程部分资料来源于&#xff1a;玩客云刷ARMBIAN系统…

linux查看进程对应的线程(数)

首先&#xff0c;top或ps查看进程列表&#xff0c;确定要查看的进程pid&#xff0c;如下面40698 查看进程的线程情况 查看进程&#xff1a;top -p 40698 查看线程&#xff1a;top -p 40698 -d 3 -H 其中-d是刷新频率 可看到此进程共211个线程&#xff0c;运行中的是211个。…

C++基础-类和对象(下)

文章目录 前言一、构造深入1.初始化列表2.隐式类型转换1.隐式类型转换2.explicit 3.委托构造 二、类的静态成员1.静态成员声明2.静态成员定义3.静态成员特性 三、重载运算符和类型转化1.关系及算数运算符重载2.递增递减运算符重载及如何区分3.赋值运算符重载4.重载输入输出运算…

【基础篇】五、基于SpringBoot来整合SSM的案例(上)

文章目录 0、创建模块1、实体类的快速开发Lombok2、数据层开发&#xff08;CRUD&#xff09;3、分页4、条件查询5、业务层的标准开发6、业务层的快速开发&#xff08;基于MyBatisPlus&#xff09;7、表现层开发 接下来在SpringBoot下&#xff0c;把Spring、SpringMVC、MyBatis整…

项目进度管理(3-3)PERT计划评审技术详解

1 计划评审技术起源 PERT&#xff08;Program Evaluation and Review Technique&#xff0c;项目评估和审查技术&#xff09;的起源可以追溯到20世纪50年代&#xff0c;与美国国防部和美国海军的项目管理有关。 PERT的发展始于20世纪50年代初&#xff0c;当时美国国防部正面临…

ConfigMaps-2

文章目录 主要内容一.Volume 挂载 ConfigMap1.创建一个Pod&#xff0c;起挂载的内容&#xff0c;将来自下面的configmap&#xff1a;代码如下&#xff08;示例&#xff09;: 2.解释 二.环境变量 ConfigMap1.创建一个名为 mysqlpass 且包含 passwordABCabc123 的 configmap&…

第一、二题见贴图第三题 实现求1-100之间的质数?

print("模式A") while True: for i in range (1,7): for j in range(1, 7): if j < i: print(j,end"\t") print() break print() print("模式B") while True: for i in range (6,…

【测开】Java快转Python 学习路径记录

写在前面 工作后需要用python&#xff0c;记录下学习的一些资料和总结&#xff0c;仅供参考&#xff0c;希望对你有帮助。 2023/9/8 (碎碎念&#xff1a;我太懂工作要用时自己却不会的感觉了…心好累&#xff0c;问大家怎么学就说这简单…md记录一下&#xff09; Part.1 对比 …

基于Java汽车服务商城系统 设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

知识图谱(3)关系抽取

信息抽取旨在从大规模非结构化或半结构化的自然语言文本中抽取结构化信息。关系抽取是其中的重要子任务&#xff0c;主要目的是从文本中识别实体并抽取实体之间的语义关系。 比如有下面的文本&#xff1a; International Business Machines Corporation (IBM or the company) …

2019-2021年上市公司润灵ESG评分评级数据

2019-2021年上市公司润灵ESG评分评级数据 1、时间&#xff1a;2019-2021年 2、指标&#xff1a;股票代码、股票简称、评级年份、所属指数名称、GICS行业一级分类、GICS行业一级分类代码、GICS行业二级分类、GICS行业二级分类代码、GICS行业三级分类、GICS行业三级分类代码、E…

【Qt 图形视图框架】QGraphics分析及使用

组成 Qt 图形视图框架分为三部分&#xff1a;场景、视图、图元。 场景对于程序来说&#xff0c;场景是不可见的&#xff0c;是一个抽象的管理图形项的容器。 可以向场景中添加图形项&#xff0c;比如&#xff1a;圆形、矩形、三角形等等 此外&#xff0c;还可以获取场景中的某…

games101 作业2

题目 光栅化一个三角形 1. 创建三角形的 2 维 bounding box。 2. 遍历此 bounding box 内的所有像素&#xff08;使用其整数索引&#xff09;。然后&#xff0c;使用像素中心的屏幕空间坐标来检查中心点是否在三角形内。 3. 如果在内部&#xff0c;则将其位置处的插值深度值 (…

GICv3学习

GICv3学习 参考文档&#xff1a; 《corelink_gic600_generic_interrupt_controller_technical_reference_manual_100336_0106_00_en》 《IHI0069H_gic_architecture_specification》 《ECM0495013B_GIC_Stream_Protocol》 一、GICv3寄存器接口 接口如下图所示&#xff1a…