手动创建线程池_创建线程池的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");
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 深度残差网络(ResNet)之ResNet34的实现和个人浅见[通俗易懂]

    深度残差网络(ResNet)之ResNet34的实现和个人浅见[通俗易懂]残差网络是由来自MicrosoftResearch的4位学者提出的卷积神经网络,在2015年的ImageNet大规模视觉识别竞赛(ImageNetLargeScaleVisualRecognitionChallenge,ILSVRC)中获得了图像分类和物体识别的优胜。**残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接(shortcut),缓解了在深度神经网络中增加深度带来的梯度消失问题**。残差网络(ResNet)的网络结构图举例如下:

  • Python 输出对齐「建议收藏」

    Python 输出对齐「建议收藏」往往要对输出内容进行对齐,看起来更清爽。python中对齐有两种方式。第一种是用格式符,如下:s1=’longlonglong.’s2=’short.’print(‘%-30s%-20s’%(s1,s2))#’%-30s’含义是左对齐,且占用30个字符位print(‘%-30s%-20s’%(s2,s1))longlonglong….

    2022年10月30日
  • (七十六) CountDownTimer

    (七十六) CountDownTimerdemo:https://github.com/happyjiatai/demo_csdn/tree/master/demo_76_countdowntimer1.CountDownTimer简介源码上是这么解释的:Scheduleacountdownuntilatimeinthefuture,with regularnotificationsoninterval…

  • linux安装pycharm教程_linux下pycharm使用

    linux安装pycharm教程_linux下pycharm使用在linux中安装pycharm很简单,解压后直接启动.1.先去官网下载安装包2.解压压缩包到自己指定的目录.第三方软件一般安装到/opt目录3.启动,可以直接运行的.进入到pycharm解压后的目录的bin目录下.pycharm.sh就是启动脚本,直接可以启动,但这样每次都要指定路径启动.shpycharm.sh启动pycharm将会阻塞一个终端,关闭终端pycharm也将随之关闭.4.创建一下快捷启动命令,指定一个别名.1.进入当前用户主目录.bashrc

  • sourceinsight4.0注册码_sourceinsight激活成功教程版安装教程

    sourceinsight4.0注册码_sourceinsight激活成功教程版安装教程SourceInsight3.x注册码:SI3US-205035-36448验证可用

  • 华为私有云的搭建方案_如何搭建私有云

    华为私有云的搭建方案_如何搭建私有云最近有个Team共享文档的需求。包括大文件,有个access文件超过500m。开始用百度网盘,发现只能分享,不能共享。试了几个其它网盘,广告超级多,但是都没有共享这个功能。基于此,找了几个私有云程序。最后选择了可道云。完美解决云共享。分享一下自己采坑经验:1.NextCloud支持Windows,Mac,Linux,iOS,Android平台,是OwnCloud的衍生版本,很不错的产…

发表回复

您的电子邮箱地址不会被公开。

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