伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

java基础|自定义java线程池

来源:本站原创 浏览:97次 时间:2022-10-06
线程池创建的参数

在创建线程的各种方式中我们有讲到过通过创建线程池来完成异步操作,但实际上jdk提供的Executors来创建线程池都还有些缺陷,线程池有以下几个参数: 代码节选自源码ThreadPoolExecutor.java的构造函数

   public ThreadPoolExecutor(int corePoolSize,                              int maximumPoolSize,                              long keepAliveTime,                              TimeUnit unit,                              BlockingQueue<Runnable> workQueue,                              ThreadFactory threadFactory,                              RejectedExecutionHandler handler)

corePoolSize: 线程池中线程的个数,最少的个数,即使是空闲的,也会存在
maximumPoolSize: 线程池中允许的连接的最大个数
keepAliveTime: corePoolSize之外的线程,在没有任务时,最大存活时间
unit: keepAlveTime 的时间单位
workQueue: 在任务还没有执行前,保存Runnable任务的地方,也就是待执行任务队列
threadFactory: 线程工厂,可自定义线程生成的方式,可以自定义名字等等
handler:在线程池和队列满的时候,如何处理新到来的任务

jdk自带线程池的缺陷

自带的线程池主要是通过Executors来初始化.

newCachedThreadPool

通过Executors.newCachedThreadPool()初始化的线程池如下文所示,可以看到maximumPoolSize的值是Integer.MAX_VALUE,这就意味着线程池里面的线程没有上限,会一直新建到OOM.

public static ExecutorService newCachedThreadPool() {        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,                                      60L, TimeUnit.SECONDS,                                      new SynchronousQueue<Runnable>());    }
newFixedThreadPool

通过Executors.newFixedThreadPool新建的线程池,我们可以看到workQueue这个参数传的是new LinkedBlockingQueue,这个队列没有设置大小,就会导致新任务会一直往里添加,直到OOM

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

通过对自带的线程池的分析,我们知道自定义的线程池主要是对池子的最大数量和等待队列的最大数量做好限制,当然还有自定义的失败策略(以后单写个DEMO讲)代码如下:

/** * @author https://www.javastudy.cloud */public class ThreadPoolTools {    /** 线程池维护线程的最少数量 */    private int minPoolSize = 10;    /** 线程池维护线程的最大数量 */    private int maxPoolSize = 500;    /** 线程池维护线程所允许的空闲时间 */    private int idleSeconds = 1800;    /** 线程池所使用的缓冲队列 */    private int queueBlockSize = 100;    private ThreadPoolExecutor executor;    public ThreadPoolTools() {        this.executor = new ThreadPoolExecutor(minPoolSize, maxPoolSize, idleSeconds,                TimeUnit.SECONDS, /* 时间单位,秒 */                new ArrayBlockingQueue<Runnable>(queueBlockSize),                new ThreadPoolExecutor.CallerRunsPolicy()); /* 重试添加当前加入失败的任务 */    }    public void execute(Runnable task) {        executor.execute(task);    }    public <T> Future<T> submit(Callable<T> task){        return executor.submit(task);    }}
DEMO总评

线程池的使用在实际开发中用到的还是挺多的,在小型开发中使用系统自带的线程池是没问题的,但有时候在生产环境中,特别是同步一些东西的时候,量级比较大,这时候使用系统自带的线程池难免会有些问题,这时候就需要自定义的线程池了,加油吧,少年!!

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net