一文详述线程池使用及其底层原理

前沿

线程池对于我们来说很熟悉了,在工作中,通过多线程处理任务,进一步的压榨CPU,提供任务处理处理速度。但是你知道线程池是如何运行的吗?知道他的实现原理吗?这篇文章就告诉你答案

正文

线程池使用

ThreadPoolExecutor 是创建线程池的类,他实现了ExecutorService接口,我们看他参数比较全的构造方法如下

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

各参数是啥意思呢?

corePoolSize :核心线程池数

maximumPoolSize:最大线程池数 

keepAliveTime:保持活跃时间

unit:时间单位

workQueue:阻塞队列

threadFactory:线程池工厂

handler:拒绝策略

各参数作用是啥呢?我们通过下面的例子来说明:

创建一个线程池对象,如下代码块

ExecutorService threadPoolExecutor = new ThreadPoolExecutor(1, 10, 1, TimeUnit.DAYS, new SynchronousQueue<Runnable>()); 

提交任务到线程池,让其处理,我们让其打印一条日志

threadPoolExecutor.execute(new Runnable() {                                                                          @Override 

public void run() {                                                                                            System.out.println("你收拾收拾");                                                                                          }                                                                      });  

1、当线程数小于核心线程数,再来一个任务则将创建一个新的线程来处理

2、当线程数等于核心线程数,则新的任务将添加到阻塞队列

3、当线程数等于核心线程数 并且队列已满,则创建新的线程来处理新的任务

4、当线程数等于最大线程数,并且队列已满,则根据构造函数中配置的拒绝策略来执行对应的操作

拒绝策略

线程池ThreadPollExecutor.java类中提供4个静态内部类作为4种抛弃任务策略方式:

1、AbortPolicy:抛出异常

2、DiscardPolicy:不做任何处理

3、DiscardOldestPolicy:把队列队头的任务(也就是等待了最长时间的)直接扔掉,然后提交这个任务到等待队列中

4、CallerRunsPolicy:如果线程池没shutDown,则由提交任务的线程来执行该任务

5、自己实现拒绝策略,通过实现RejectedExecutionHandler接口

实现原理

我们从execute()方法进行分析

 

 

 下面我们看下start方法

 

 

我们回过头看下getTask()方法

 整个线程池执行原来到这里结束了,其实他的源码并不多,从逻辑上看到看到,他运用了一些while循环来不停的处理从队列里获取任务。

猜你喜欢

转载自blog.csdn.net/zanpengfei/article/details/124590956