一、ThreadPoolExecutor的定义和构造
ThreadPoolExecutor是线程池的一个实现类,它可以通过管理线程池中的线程来提高程序的性能和效率。下面介绍ThreadPoolExecutor的构造方法和参数:
public ThreadPoolExecutor(int corePoolSize, //线程池中核心线程数 int maximumPoolSize, //线程池最大线程数 long keepAliveTime, //超出核心线程数的空闲线程存活时间 TimeUnit unit, //存活时间的单位 BlockingQueue workQueue, //保存任务的阻塞队列 ThreadFactory threadFactory, //线程工厂 RejectedExecutionHandler handler //拒绝策略 )
1、corePoolSize:线程池中维护的线程数量,即核心线程数,当线程池处于运行状态时,即使线程处于空闲状态也不会被回收;
2、maximumPoolSize:线程池中允许的最大线程数量;
3、keepAliveTime:当线程池中线程数量大于corePoolSize时,超出的空闲线程在被终止之前需要继续维护的时间;
4、unit:keepAliveTime的时间单位;
5、workQueue:阻塞队列,用于保存等待执行的任务;
6、threadFactory:线程工厂,用于创建新的线程;
7、handler:拒绝策略,用于处理当线程池已满时如何拒绝新任务的策略。
二、线程池中的线程池状态
线程池状态主要包括RUNNING、SHUTDOWN、STOP、TIDYING和TERMINATED。下面介绍这些状态的含义:
1、RUNNING:正在运行中,即线程池尚未关闭,并且其中的线程正在处理任务; 2、SHUTDOWN:线程池正在关闭中,不接受新的任务提交,但是队列中的任务会继续执行完; 3、STOP:线程池终止,不再接受新的任务,且正在处理的任务全部被中断并移出工作队列; 4、TIDYING:线程池处于SHUTDOWN状态时,所有的任务都已经执行完毕,线程池正在进行关闭操作; 5、TERMINATED:线程池已经完全终止。
三、阻塞队列的选择
ThreadPoolExecutor使用阻塞队列来保存等待执行的任务。下面介绍几种常见的阻塞队列:
1、ArrayBlockingQueue :一个基于数组结构的有界阻塞队列,按照先进先出原则对元素进行排序;
2、LinkedBlockingQueue :一个基于链表结构的有界阻塞队列,按照先进先出原则对元素进行排序,如果没有指定容量,则为Integer.MAX_VALUE;
3、SynchronousQueue :一个不存储元素的阻塞队列,在这个队列中每个插入操作必须等待另一个线程的移除操作,否则插入操作一直处于阻塞状态;
4、PriorityBlockingQueue:带有优先级的无界阻塞队列,按照先进先出原则排序,同时可以按照指定的Comparator插入元素,优先级高的元素会被先移除;
5、DelayQueue:是一个带有延时功能的无界阻塞队列,元素必须先定义延时时间,只有延时时间到期后才能被取出,适用于定时任务。
四、线程池的拒绝策略
线程池中当任务数超过最大线程数且阻塞队列已满时,会触发拒绝策略。下面介绍几种常见的拒绝策略:
1、AbortPolicy:抛出RejectedExecutionException,即不作处理;
2、CallerRunsPolicy:由提交任务的线程执行该任务;
3、DiscardOldestPolicy:将等待时间最长的任务从队列中删除,然后执行新的任务;
4、DiscardPolicy:不处理,静默丢弃。
五、ThreadPoolExecutor的使用示例
import java.util.concurrent.*; public class ThreadPoolDemo { public static void main(String[] args) { //核心线程数为3,最大线程数为5,超过corePoolSize的线程数进入阻塞队列,阻塞队列大小为10,超过则使用拒绝策略。 ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); for (int i = 0; i < 20; i++) { executor.execute(new Runnable() { @Override public void run() { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is running"); } }); } executor.shutdown(); } }
六、线程池的关闭
1、executor.shutdown():关闭线程池,会先停止接受新的任务,在等待所有任务执行完毕后关闭线程池;
2、executor.shutdownNow():立即关闭线程池,会尝试停止所有正在执行的任务,并返回未执行的任务;
3、executor.awaitTermination(long timeout, TimeUnit unit):等待线程池终止的时间,或者等待超时时间的过程中被中断。
七、总结
ThreadPoolExecutor事实上是Thread Pool模式的Java语言实现,它为并发编程提供了灵活而高效的线程池实现,适用于多种多样的场景。在实际应用中,我们可以根据应用场景来选择合适的的Thread Pool实例对象,以提高程序的性能和效率。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/312834.html