如何创建线程池[通俗易懂]

如何创建线程池[通俗易懂]如何创建线程池

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

Jetbrains全系列IDE稳定放心使用

在开发中有时候会需要异步操作,这个时候就需要自己写个线程,但是每次都需要重复写代码非常不方便也不安全,所以线程池就是更好的选择。那么如何创建一个线程池呢?

首先会想到使用Executors创建线程池,因为这是java中的工具类,提供工厂方法来创建不同类型的线程池。
在这里插入图片描述
从上图中也可以看出,Executors的创建线程池的方法,创建出来的线程池都实现了ExecutorService 接口。常用方法有以下几个:
newFiexedThreadPool(int Threads):创建固定数目线程的线程池。

newCachedThreadPool():创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。

newSingleThreadExecutor() 创建一个单线程化的Executor。

newScheduledThreadPool(int corePoolSize) 创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

类看起来功能还是比较强大的,又用到了工厂模式、又有比较强的扩展性,重要的是用起来还比较方便,如:

ExecutorService executor = Executors.newFixedThreadPool(nThreads) ;

即可创建一个固定大小的线程池。虽然看起来很美好,却不鼓励大家使用。甚至在阿里Java 开发手册中是禁止使用的。
在这里插入图片描述
可以看出,不仅禁止使用,也给出了禁止使用的理由:就是Executors创建的线程其队列长度和允许创建的线程数太大了,可能导致内存溢出。既然知道了原因,那么我们创建线程池的时候指定堵塞队列长度和最大线程数不就好了?是的,所以开发手册也给出了解决方案,避免使用Executors创建线程池,主要是避免使用其中的默认实现,那么我们可以自己直接调用ThreadPoolExecutor的构造函数来自己创建线程池。在创建的同时,给BlockQueue 指定容量就可以了。如下:

private static ExecutorService executor = new ThreadPoolExecutor(10, 20,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue(10));

接下来看看该构造方法:

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) { 
   
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

可以看出,自定义线程池的时候,指定了核心线程数、最大线程数、阻塞队列长度等。这样就不会因为队列长度或者线程数太多而发生内存溢出了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • 交叉验证方法汇总【附代码】(留一法、K折交叉验证、分层交叉验证、对抗验证、时间序列交叉验证)

    交叉验证方法汇总【附代码】(留一法、K折交叉验证、分层交叉验证、对抗验证、时间序列交叉验证)交叉验证是什么?在模型建立中,通常有两个数据集:训练集(train)和测试集(test)。训练集用来训练模型;测试集是完全不参与训练的数据,仅仅用来观测测试效果的数据。一般情况下,训练的结果对于训练集的拟合程度通常还是挺好的,但是在测试集总的表现却可能不行。比如下面的例子:图一的模型是一条线型方程。可以看到,所有的红点都不在蓝线上,所以导致了错误率很高,这是典型的不拟合的情况图二的蓝线则更加贴近实际的红点,虽然没有完全重合,但是可以看出模型表示的关系是正确的。图三,所有点都在蓝线上,这时候

    2025年7月14日
    3
  • MongoDb的ConnectionString链接字符串解析

    MongoDb的ConnectionString链接字符串解析MongoDb的ConnectionString链接字符串解析,如下图所示。

    2022年7月12日
    62
  • 网络规划与设计「建议收藏」

    网络规划与设计「建议收藏」一、网络生命周期网络生命周期就是网络系统从思考、调查、分析、建设到最后淘汰的总过程。常见的网络生命周期是四阶段周期模型、五阶段周期模型、六阶段周期模型。1.四阶段周期模型特点:能够快速适应新的

    2022年7月3日
    25
  • 深入浅出学python_深入浅出Python机器学习 (段小手) 完整pdf高清版[176MB]

    深入浅出学python_深入浅出Python机器学习 (段小手) 完整pdf高清版[176MB]机器学习正在迅速改变我们的世界。我们几乎每天都会读到机器学习如何改变日常的生活。如果你在淘宝或者京东这样的电子商务网站购买商品,或者在爱奇艺或是腾讯视频这样的视频网站观看节目,甚至只是进行一次百度搜索,就已经触碰到了机器学习的应用。使用这些服务的用户会产生数据,这些数据会被收集,在进行预处理之后用来训练模型,而模型会通过这些数据来提供更好的用户体验。此外,目前还有很多使用机器学习技术的产品或服务即…

    2022年10月18日
    2
  • zip文件的解压,获取字节流

    zip文件的解压,获取字节流

    2022年4月2日
    126
  • bat time命令_bat获取文件修改时间

    bat time命令_bat获取文件修改时间最近公司的项目,需要部署一个oracle定时备份脚本,删除掉特定时间前的备份文件。BAT批处理文件结合windows系统(任务计划程序)正常情况下我们的任务计划会有反馈数值,通过它可以判断这个任务计划上次是否运行正常。代码0或0x0:操作成功完成。代码1或0x1:调用的函数不正确或调用了未知函数。代码10或0xa:环境不正确。代码0x8009000f…

    2022年9月19日
    6

发表回复

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

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