线程池对于我们来说很熟悉了,在工作中,通过多线程处理任务,进一步的压榨CPU,提供任务处理处理速度。但是你知道线程池是如何运行的吗?知道他的实现原理吗?这篇文章就告诉你答案
正文 线程池使用ThreadPoolExecutor 是创建线程池的类,他实现了ExecutorService接口,我们看他参数比较全的构造方法如下
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueueworkQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
各参数是啥意思呢?
corePoolSize :核心线程池数
maximumPoolSize:最大线程池数
keepAliveTime:保持活跃时间
unit:时间单位
workQueue:阻塞队列
threadFactory:线程池工厂
handler:拒绝策略
各参数作用是啥呢?我们通过下面的例子来说明:
创建一个线程池对象,如下代码块
ExecutorService threadPoolExecutor = new ThreadPoolExecutor(1, 10, 1, TimeUnit.DAYS, new SynchronousQueue
());
提交任务到线程池,让其处理,我们让其打印一条日志
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循环来不停的处理从队列里获取任务。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)