Java线程与线程池与阻塞队列原理

Android 同时被 2 个专栏收录
533 篇文章 0 订阅
107 篇文章 0 订阅

线程池策略

在这里插入图片描述
corePoolSize:核心线程数;maximunPoolSize:最大线程数
每当有新的任务加入到线程池时,
第一步: 先判断线程池中当前线程数量是否达到了corePoolSize,若未达到,则新建线程运行此任务,且任务结束后将该线程保留在线程池中,不做销毁处理,若当前线程数量已达到corePoolSize,则进入下一步;
第二步: 判断工作队列(workQueue)是否已满,未满则将新的任务提交到工作队列中,满了则进入下一步;
第三步: 判断线程池中的线程数量是否达到了maxumunPoolSize,如果未达到,则新建一个工作线程来执行这个任务,如果达到了则使用饱和策略来处理这个任务。注意: 在线程池中的线程数量超过corePoolSize时,每当有线程的空闲时间超过了keepAliveTime,这个线程就会被终止。直到线程池中线程的数量不大于corePoolSize为止。
(由第三步可知,在一般情况下,Java线程池中会长期保持corePoolSize个线程。)

举个例子:
比如核心线程数是10,最大线程数是100,当前线程池中有11个线程,并且都在执行任务,这时如果来了个新任务,这个新任务会被加入到等待队列,而不是新建线程执行这个新任务,即便当前线程数量11<最大线程数100。

无界队列和有界队列

有界队列:就是有固定大小的队列。比如设定了固定大小的 LinkedBlockingQueue,又或者大小为 0,只是在生产者和消费者中做中转用的 SynchronousQueue。
无界队列:指的是没有设置固定大小的队列。这些队列的特点是可以直接入列,直到溢出。当然现实几乎不会有到这么大的容量(超过 Integer.MAX_VALUE),所以从使用者的体验上,就相当于 “无界”。
比如没有设定固定大小的 LinkedBlockingQueue:new LinkedBlockingQueue() ,默认队列大小就是 Integer.MAX_VALUE。

所以无界队列的特点就是可以一直入队列,不存在队列满负荷的现象。这个特性,在我们自定义线程池的使用中非常容易出错。而出错的根本原因是对线程池内部原理的不了解。

如果使用LinkedBlockingQueue,但是没有设置容量大小,那么容量大小则是默认值(最大值,Integer.MAX_VALUE),这就相当于是一个无界队列了。 除了SynchronousQueue队列是有界(容量为0),其他队列有界无界,需要看你创建队列时有没有指定容量大小,有固定容量大小的队列为有界队列,没有设置固定容量大小的队列为无界队列,当然设置为Integer.MAX_VALUE的队列也是无界队列,因为来了任务可以直接入队,几乎不会满,否则估计系统已经崩了。

你以为已经理解线程池了?来看看下面几个问题可以回答出几个,哈哈哈。

线程池中的核心线程会销毁吗?

线程池是如何保证核心线程不被销毁的?

线程池中的核心线程是如何被重复利用的?

线程池中多余的线程是如何回收的?

keepAliveTime是指当线程池中线程数量大于corePollSize时,此时存在非核心线程,keepAliveTime指非核心线程空闲时间达到的阈值会被回收。
java核心线程池的回收由allowCoreThreadTimeOut参数控制,默认为false,若开启为true,则此时线程池中不论核心线程还是非核心线程,只要其空闲时间达到keepAliveTime都会被回收。
但如果这样就违背了线程池的初衷(减少线程创建和开销),所以默认该参数为false

Java核心技术-并发编程-线程与线程池
Java核心技术19 | 并发库中的线程池
Java多线程 - 线程池

Java线程池是如何保证核心线程不被销毁的
突然就懵了!面试官问我:线程池中多余的线程是如何回收的?

当面试官问线程池时,你应该知道些什么?

Executors创建线程池会造成OOM问题
问题分析-无界线程池误用导致OOM:java.lang.OutOfMemoryError:unable to create new native thread
有界、无界队列对ThreadPoolExcutor执行的影响
聊聊Java中的并发队列中 有界队列和无界队列的区别

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值