Java封装了ThreadPoolExecutor构造线程池更好地管理多线程,使用线程池有如下两点好处:
1,使用线程池复用线程避免了创建线程和销毁线程所需的开销
2,提供了专门的线程池管理,任务管理,并发控制等功能
ThreadPoolExecutor构造器提供了6个入参:
corePoolSize
maxPoolSize
keepAliveTime
timeUnit
BlockingQueue
ThreadFactory
corePoolSize表示线程池中活跃可用的线程数目,即使没有任务运行,线程池中也会保留corePoolSize个活跃线程
maxPoolSize表示线程池中允许运行的最大线程数,该参数会结合blockingQueue来介绍
keepAliveTime表示当线程池中线程数目大于corePoolSize,而没有任务运行来占用这些线程,这些线程存活的时间
timeUnit表示keepAliveTime的单位
BlockingQueue表示新提交的任务没有线程可以用来执行,先将这些任务放入阻塞队列等待执行
ThreadFactory表示创建线程的工程
RejectedExecutionHandler表示线程池不再接受新任务的拒绝策略
BlockingQueue有如下几种:
1,ArrayBlockingQueue 有界队列
2,LinkedBlockingQueue 无界队列
3,PriorityBlockingQueue 优先队列
4,SynchronousQueue 只允许队列中存储一个元素
一,ArrayBlockingQueue
1,当任务数小于等于corePoolSize,直接放进线程池执行
2,当任务数大于corePoolSize小于有界队列大小,将没有被执行的任务放入blockingQueue阻塞等待执行
3,当任务数大于corePoolSize+有界队列大小,新建线程执行,新建的线程数目小于maxPoolSize-corePoolSize
4,当任务数大于maxPoolSize+有界队列大小,执行拒绝策略
二,LinkedBlockingQueue
1,当任务数小于等于corePoolSize,直接放进线程池执行
2,当任务数大于corePoolSize,多出来的 任务直接放入无界队列等待执行
3,在LinkedBlockingQueue的模式下,maxPoolSize无意义,因为新进来的任务总可以放入无界阻塞队列中
三,PriorityBlockingQueue 优先队列