线程池参数
合理利用线程池能够带来三个好处。
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 第三:提高线程的可管理性。
corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。
线程池基本工作流程
首先用ThreadpoolExecutor创建一个新的线程池
首先,当任务到达时,运行的线程数<corepoolsize,会新建线程,
如果运行的线程数>=corepoolsize,线程会进入队列,而不添加新的线程
若队列是new ArrayBlockingQueue<>()有界队列,当队列满了之后,再有新的任务到达,此时还没到达maximumpoolsize,就会新建线程,运行任务
有界队列
1 | ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(1); |
无界队列
1 | LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); |
对于无届队列来说,
newFixedThreadPool和newSingleThreadExecutor底层用的是无届队列
特殊的队列
1 | package cn.zlq.SynchronousQueue; |
先看结果
put线程执行后就被阻塞了,只有消息被消费后,put线程才可以返回.
默认是非公平 也即是栈结构,公平模式下用的是队列结构
底层实现请前往博客
https://blog.csdn.net/yanyan19880509/article/details/52562039
newCachedThreadPool底层用的就是这个队列
Comments