并发--java线程池原理
Posted 李晓娜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发--java线程池原理相关的知识,希望对你有一定的参考价值。
线程池Execotors工具可以创建普通的线程池以及schedule调度任务的调度池。使用线程池的一个优点就是:
1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。
2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。
线程池创建的方式是:
线程池的核心类
java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,可以来看下这个类:
从源码上我们看出了ThreadPoolExecutor继承了AbstractExecutorService类,并且有四个构造方法。
可以来具体分析下构造方法中每个参数的意义:
(1) corePoolSize:核心池的大小。创建池创建时,默认情况下线程池是没有线程池的,只有请求任务到来的时候才会创建线程来处理请求。但是我们可以通过调用prestartAllCoreThreads()或者prestartCoreThread()方法来预先创建线程,也就是即使没有任务也会创建corePoolSize个或者一个的线程,当线程池的数量达到了corePoolSize的时候,此时会把到达的任务放到缓冲队列中去。
(2) maximumPoolSize:线程池最大线程数
(3) keepAliveTime:线程在多久之后停止执行,这个时间是在当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,大于那部分线程,空闲时间达到了keepAliveTime,就会停止,除了调用了调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
(4) unit:参数keepAliveTime的时间单位
(5) workQueue:一个阻塞队列,用来存储等待执行的任务
(6) threadFactory:线程工厂,主要用来创建线程
(7) handler:表示当拒绝处理任务时的策略
线程池的执行原理
1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。
2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。
有时间继续~
以上是关于并发--java线程池原理的主要内容,如果未能解决你的问题,请参考以下文章
Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析