手动创建线程池_创建线程池的5个参数

手动创建线程池_创建线程池的5个参数一,Executors类不建议使用自带的工具类的!使用JDK自带的Executors工具类(图中蓝色框中的那个,这是独立于线程池继承关系图的工具类,类似于Collections和Arrays)可以直接创建以下种类的线程池线程数量固定的线程池,此方法返回ThreadPoolExecutorpublicstaticExecutorServicenewFixedThreadPool(intnThreads){……}单线程线程池,此方法返回ThreadPoolExecu

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一,Executors类

不建议使用自带的工具类的!
使用 JDK 自带的 Executors工具类 (图中蓝色框中的那个,这是独立于线程池继承关系图的工具类,类似于 Collections 和 Arrays) 可以直接创建以下种类的线程池

线程数量固定的线程池,此方法返回
ThreadPoolExecutorpublic static ExecutorService newFixedThreadPool(int nThreads) {… …}
单线程线程池,此方法返回
ThreadPoolExecutorpublic static ExecutorService newSingleThreadExecutor() {… …}
可缓存线程的线程池,此方法返回
ThreadPoolExecutorpublic static ExecutorService newCachedThreadPool() {… …}
执行定时任务的线程池,此方法返回
ScheduledThreadPoolExecutorpublic static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {… …}
可以拆分执行子任务的线程池,此方法返回
ForkJoinPoolpublic static ExecutorService newWorkStealingPool() {… …}

我们可以发现他们得底层实现都是用了ThreadPoolExecutor,然而第五个参数使用到的阻塞队列默认值是Integer.MAX_VALUE,也就是
2147483647,这样就相当于是一个无界的队列。所有的请求都往里塞,最终造成OOM.

二,手动创建线程池

1.常用的线程池实现类是 ThreadPoolExecutor

/** * 各参数含义 * corePoolSize : 线程池中常驻的线程数量。核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会 * 受存活时间 keepAliveTime 的限制,除非将 allowCoreThreadTimeOut 设置为 true。 * maximumPoolSize : 线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。当任务队列为没有设置大小的LinkedBlockingQueue时,这个值无效。 * keepAliveTime : 当线程数量多于 corePoolSize 时,空闲线程的存活时长,超过这个时间就会被回收 * unit : keepAliveTime 的时间单位 * workQueue : 存放待处理任务的队列 * threadFactory : 线程工厂 * handler : 拒绝策略,拒绝无法接收添加的任务 */
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) { 
    ... ... }

2.底层线程池实现的7大参数

corePoolSize:线程池中的常驻核心线程数
maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1
keepAliveTime:多余的空闲线程的存活时间
unit:keepAliveTime的单位
workQueue:任务队列,被提交但尚未被执行的任务。
threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认
handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数

3.工作原理

线程池的底层工作原理core基本线程数,当线程数大于corePoolSize时,多余线程将转入阻塞队列,阻塞队列也满了之后将扩容到maximumPoolSize数。
maximumPoolSize也满了之后将采取拒绝策略。当线程数小了之后,根据设定的空闲线程存活时间将线程总容量回缩到corePoolSize

4,使用可自定义线程名称的线程工厂

4.1,这个就简单多了,可以借助大名鼎鼎的谷歌开源工具库 Guava,首先引入如下依赖:

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>28.2-jre</version>
</dependency>

4.2,自定义实现手动创建线程池

public class ThreadPoolDemo { 
   
// 线程数
    public static final int THREAD_POOL_SIZE = 16;

    public static void main(String[] args) throws InterruptedException { 
   
        // 使用 ThreadFactoryBuilder 创建自定义线程名称的 ThreadFactory
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
                .setNameFormat("hyn-demo-pool-%d").build();
        
        // 创建线程池,其中任务队列需要结合实际情况设置合理的容量
        ThreadPoolExecutor executor = new ThreadPoolExecutor(THREAD_P15OOL_SIZE,
                THREAD_POOL_SIZE,
                0L,
                TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1024),
                namedThreadFactory,
                new ThreadPoolExecutor.AbortPolicy());
        
        // 新建 1000 个任务,每个任务是打印当前线程名称
        for (int i = 0; i < 1000; i++) { 
   
            executor.execute(() -> System.out.println(Thread.currentThread().getName()));
        }
        // 优雅关闭线程池
        executor.shutdown();
        executor.awaitTermination(1000L, TimeUnit.SECONDS);
        // 任务执行完毕后打印"Done"
        System.out.println("Done");
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187192.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue格式化时间戳_日期格式转换

    vue格式化时间戳_日期格式转换第一步:下载安装第三方组件:npminstallmoment–save第二步:在你需要格式化时间的页面引入moment组件importmomentfrom’moment’第三步:然后配合我们element-ui,在元素中加入:formatter<el-table-columnprop=”add_time”label=”创建时间”:formatter=”dateFormat”width=”200px”></el-table-column&gt

    2022年9月25日
    5
  • mac怎么装linux双系统_双系统linux和windows

    mac怎么装linux双系统_双系统linux和windows第一步:格式化U盘第二步:下载系统,这里我选择的是基于manjaro第三步:将iso镜像转成dmg格式第四步:写入镜像第五步:分空间第六步:关闭OSX的-SIP保护第七步:安装refind第八步:重启按住option键安装系统第九步:重启查看结果第一步:格式化U盘第二步:下载系统,这里我选择的是基于manjaro第三步:…

    2022年9月28日
    0
  • 廖雪峰的 Python 教程_python基础教程廖雪pdf

    廖雪峰的 Python 教程_python基础教程廖雪pdfimportmath#一元二次方程defquadratic(a,b,c): n=b/a/2 m=abs(n*n-c/a) x1=math.sqrt(m)-n x2=-math.sqrt(m)-n returnx1,x2#一个或多个数的乘积defproduct(f,*args): result=f; forxinargs: resu…

    2025年6月23日
    3
  • 请画出下面流程图对应的N-S图以及PAD图_N E S W分别代表什么方向

    请画出下面流程图对应的N-S图以及PAD图_N E S W分别代表什么方向E-R图:E-R图也称实体-联系图(EntityRelationshipDiagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。矩形框:表示实体,在框中记入实体名。菱形框:表示联系,在框中记入联系名。椭圆形框:表示实体或联系的属性,将属性名记入框中。对于主属性名,则在其名称下划一下划线。连线:实体与属性之间;实体与联系之间;联系与属性之间用直线相连,并在直…

    2022年8月13日
    8
  • 查看Python安装路径_Python安装路径

    查看Python安装路径_Python安装路径查看Python安装路径方法在使用python的时候,有时候会需要找到python包的安装位置,怎么办?法一、对于Windows平台,打开cmd输入命令wherePython,回车(即按下Enter键)可输出Python的安装路径。参见下图:【如何清除命令行窗口内容输入cls回车】法二、在IDLE(Python自带的简洁的集成开发环境)中先输入impor…

    2022年4月19日
    68
  • java中高级面试题总结(全面)_java面试题大全

    java中高级面试题总结(全面)_java面试题大全jvm结构原理,GC工作原理Jvm结构:Jvm主要包括四个部分:1、类加载器(ClassLoad)在JVM启动时或者在类运行时将需要的class加载到JVM中。类加载时间与过程:类从被加载到虚拟机内存开始,在到卸载出内存为止,正式生命周期包括了:加载,验证,准备,解析,初始化,使用和卸载7个阶段。其中验证、准备、解析这个三个步…

    2022年8月20日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号