线程池Executor

1.线程池的作用

第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。

第三:减少线程之间的替换

2.ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize, //线程核心数

           int maximumPoolSize,//线程非核心树&&线程总数

           long keepAliveTime,//空闲线程存活时间

           TimeUnit unit,//时间单位

           BlockingQueue<Runnable> workQueue,//队列

           ThreadFactory threadFactory,//线程工厂

            RejectedExecutionHandler handler//拒绝策略) {

           this(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,

           Executors.defaultThreadFactory(),defaultHandler);

}

3.Executors 工具类(阿里不推荐)

1.Executors.newCachedThreadPool();//没有核心线程,非核心线程无限大SynchronousQueue是一个不存储元素的队列,可以理解为队列永远是满的(可能导致处理器负荷太大,最终服务器崩溃)

2.Executors.newFixedThreadPool(10);//设置核心线程数,只有核心线程(他的队列是LinkedBlockingQueue,LinkedBlockingQueue是一个用链表实现的有界阻塞队列,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列,最大长度为Integer.MAX_VALUE。如果我们不设置LinkedBlockingQueue的容量的话,其默认容量Integer.MAX_VALUE,将会是可能导致内存溢出)

3.Executors.newSingleThreadExecutor();//只有一个核心线程(可能导致内存溢出)

4.自定义ThreadPoolExecutor

ThreadPoolExecutor threadPoolExecutor =new ThreadPoolExecutor(10,

            20,

            0L,

            TimeUnit.MILLISECONDS,

            new ArrayBlockingQueue<Runnable>(10));

5.使用线程池

execute方法或submit

拒绝策略

 CallerRunsPolicy - 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大

  AbortPolicy - 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。

 DiscardPolicy - 直接丢弃,其他啥都没有

     DiscardOldestPolicy -  当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容