Java面试之线程池

什么是线程池, 线程池有哪些 (创建)

线程池就是事先将多个线程对象放到一个容器中, 当使用的时候就不用 new 线程而是 直接去池中拿线程即可, 节省了开辟子线程的时间, 提高的代码执行效率

JDKjava.util.concurrent.Executors 中提供了生成多种线程池的静态方法 。

ExecutorService

newCachedThreadPool

=

Executors.newCachedThreadPool();

ExecutorService

newFixedThreadPool

=

Executors.newFixedThreadPool(4);

ExecutorService

newSingleThreadExecutor

=

Executors.newSingleThreadExecutor();

然后调用他们的 execute 方法即可 。

这 4 种线程池底层 全部是 ThreadPoolExecutor 对象的实现, 阿里规范手册中规定线 程池采用 ThreadPoolExecutor 自定义的, 实际开发也是。

(1) newCachedThreadPool

创建一个可缓存线程池, 如果线程池长度超过处理需要, 可灵活回收空闲线程, 若 无可回收, 则新建线程 。这种类型的线程池特点是:

  • 工作线程的创建数量几乎没有限制(其实也有限制的,数目为 Interger.MAX_VALUE), 这样可灵活的往线程池中添加线程 。
  • 如果长时间没有往线程池中提交任务, 即如果工作线程空闲了指定的时间(默认为 1 分钟), 则该工作线程将自动终止 。终止后, 如果你又提交了新的任务, 则线程 池重新创建一个工作线程。
  • 在使用 CachedThreadPool 时, 一定要注意控制任务的数量, 否则, 由于大量线程 同时运行, 很有会造成系统瘫痪。

(2) newFixedThreadPool

创建一个指定工作线程数量的线程池 。每当提交一个任务就创建一个工作线程, 如 果工作线程数量达到线程池初始的最大数, 则将提交的任务存入到池队列中 。 FixedThreadPool 是一个典型且优秀的线程池, 它具有线程池提高程序效率和节省 创建线程时所耗的开销的优点 。但是, 在线程池空闲时, 即线程池中没有可运行任 务时, 它不会释放工作线程, 还会占用一定的系统资源 。

(3) newSingleThreadExecutor

创建一个单线程化的 Executor, 即只创建唯一的工作者线程来执行任务, 它只会 用唯一的工作线程来执行任务, 保证所有任务按照指定顺序(FIFO, LIFO, 优先级) 执行 。如果这个线程异常结束, 会有另一个取代它, 保证顺序执行 。单工作线程最 大的特点是可保证顺序地执行各个任务, 并且在任意给定的时间不会有多个线程是 活动的 。

(4) newScheduleThreadPool

创建一个定长的线程池, 而且支持定时的以及周期性的任务执行 。例如延迟 3 秒 执行。

为什么要使用线程池

(1) 线程池做的工作主要是控制运行的线程数量, 处理过程中将任务放入队列, 然 后在线程创建后启动这些任务, 如果线程数量超过了最 大数量, 超出数量的线程排队 等候, 等其它线程执行完毕, 再从队列中取出任务来执行 。

(2) 主要特点:线程复用;控制最大并发数:管理线程 。

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

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

第三: 提高线程的可管理性 。线程是稀缺资源, 如果无限制的创建, 不仅会消耗系 统资源, 还会降低系统的稳定性, 使用线程池可以进 行统一的分配, 调优和监控

线程池底层工作原理

(1) 第一步: 线程池刚创建的时候, 里面没有任何线程, 等到有任务过来的时候才会 创建线程 。当然也可以调用 prestartAllCoreThreads() 或者 prestartCoreThread() 方法预创建 corePoolSize 个线程

(2) 第二步: 调用 execute()提交一个任务时, 如果当前的工作线程数 <corePoolSize, 直接创建新的线程执行这个任务

(3) 第三步: 如果当时工作线程数量>=corePoolSize, 会将任务放入任务队列中缓存

(4) 第四步: 如果队列已满, 并且线程池中工作线程的数量<maximumPoolSize, 还是 会创建线程执行这个任务

(5) 第五步: 如果队列已满, 并且线程池中的线程已达到 maximumPoolSize, 这个时 候会执行拒绝策略, JAVA 线程池默认的策略是 AbortPolicy, 即抛出 RejectedExecutionException 异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值