前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何创建线程池

如何创建线程池

作者头像
全栈程序员站长
发布2022-11-10 09:57:14
1.1K0
发布2022-11-10 09:57:14
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

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

首先会想到使用Executors创建线程池,因为这是java中的工具类,提供工厂方法来创建不同类型的线程池。

在这里插入图片描述
在这里插入图片描述

从上图中也可以看出,Executors的创建线程池的方法,创建出来的线程池都实现了ExecutorService 接口。常用方法有以下几个: newFiexedThreadPool(int Threads):创建固定数目线程的线程池。

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

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

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

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

代码语言:javascript
复制
ExecutorService executor = Executors.newFixedThreadPool(nThreads) ;

即可创建一个固定大小的线程池。虽然看起来很美好,却不鼓励大家使用。甚至在阿里Java 开发手册中是禁止使用的。

在这里插入图片描述
在这里插入图片描述

可以看出,不仅禁止使用,也给出了禁止使用的理由:就是Executors创建的线程其队列长度和允许创建的线程数太大了,可能导致内存溢出。既然知道了原因,那么我们创建线程池的时候指定堵塞队列长度和最大线程数不就好了?是的,所以开发手册也给出了解决方案,避免使用Executors创建线程池,主要是避免使用其中的默认实现,那么我们可以自己直接调用ThreadPoolExecutor的构造函数来自己创建线程池。在创建的同时,给BlockQueue 指定容量就可以了。如下:

代码语言:javascript
复制
private static ExecutorService executor = new ThreadPoolExecutor(10, 20,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue(10));

接下来看看该构造方法:

代码语言:javascript
复制
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) { 
   
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月1日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档