关于线程池你了解多少???

​​​​​

1.为什么要使用线程池?

为了减少在创建和销毁线程上所花的时间以及系统资源的开销

2.线程池有什么作用?

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

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

第三:提高线程的可管理性。

3.说说几种常见的线程池及使用场景

  1. :newSingleThreadExecutor :单线程线程池

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。

    如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它,

此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

    适用场景:一个任务一个任务执行的场景

  1. :newFixedThreadExecutor(n) :固定大小线程池。

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。

    线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

    适用场景:执行长期的任务,性能好很多

  1. :newCacheThreadExecutor(推荐使用):无界线程池,可以进行自动线程回收

创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。

    此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

    适用场景:执行很多短期异步的小程序或者负载较轻的服务器

  1. :newScheduleThreadExecutor

:创建一个固定大小的线程池,线程池内线程存活时间无限制,线程池可以支持定时及周期性任务执行,如果所有线程均处于繁忙状态,对于新任务会进入DelayedWorkQueue队列中,这是一种按照超时时间排序的队列结构 

适用场景:周期性执行任务的场景

 

4.线程池都有哪几种工作队列?threadLocal是什么?

有两种工作队列 无界队列和有界队列

ThreadLocal是解决多线程程序的并发问题的一种新的思路,它为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性。

 

5.怎么理解无界队列和有界队列?

什么是有界队列?就是有固定大小的队列。比如设定了固定大小的 LinkedBlockingQueue,又或者大小为 0,只是在生产者和消费者中做中转用的 SynchronousQueue。

什么是无界队列?指的是没有设置固定大小的队列。这些队列的特点是可以直接入列,直到溢出。当然现实几乎不会有到这么大的容量(超过 Integer.MAX_VALUE),所以从使用者的体验上,就相当于 “无界”。比如没有设定固定大小的 LinkedBlockingQueue。与有界队列相比,除非系统资源耗尽,否则无界的任务队列不存在任务入队失败的情况。

 

6.线程池中的几种重要的参数及流程说明

corePoolSize,线程池里最小线程数

maximumPoolSize,线程池里最大线程数量,超过最大线程时候会使用

rejectedExecutionHandler:任务拒绝处理器

keepAliveTime,线程最大的存活时间

workerQueue,缓存异步任务的队列

threadFactory,用来构造线程池里的worker线程

allowCoreThreadTimeout:允许核心线程超时

线程池任务执行流程:

            当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。

            当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行

            当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务

            当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理

            当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程

            当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

猜你喜欢

转载自blog.csdn.net/WJWFighting/article/details/81352889