线程池的做用缓存
1.下降资源的消耗ide
2.提升效率this
3.方便管理spa
相关概念线程
corePoolSize核心线程数:核心池的大小,当有任务到达以后,就会建立一个线程去执行任务,当任务数量到达核心线程数后,就会把到达的任务放到缓存队列中去。code
maximumPoolSize: 线程池最大线程数,它表示在线程池中最多能建立多少个线程。blog
keepAliveTime:表示线程没有任务执行是,最多保持多久的时间就会终止。队列
unit:参数keepAliveTime的时间单位,有7种取值,具体在TimeUnit类中。资源
线程池运行原理:get
1.原理剖析
提交一个任务到线程池中,线程池的处理流程以下:
①判断线程池里的核心线程是否都在执行任务,若是不是(核心线程空闲或者还有核心线程没有被建立)则建立一个新的工做线程来执行任务。若是核心线程都在执行任 务,则进入下个流程。
②线程池判断工做队列是否已满,若是工做队列没有满,则将新提交的任务存储在这个工做队列里。若是工做队列满了,则进入下个流程。
③判断线程池里的线程是否都处于工做状态,若是没有,则建立一个新的工做线程来执行任务。若是已经满了,则交给饱和策略来处理这个任务。
线程池的使用:
1.自定义线程池注意事项
若是当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会建立一个线程去执行这个任务;
若是当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败 (通常来讲是任务缓存队列已满),则会尝试建立新的线程去执行这个任务;
若是队列已经满了,则在总线程数不大于maximumPoolSize的前提下,则建立新的线程
若是当前线程池中的线程数目达到maximumPoolSize,则会采起任务拒绝策略进行处理;
若是线程池中的线程数量大于 corePoolSize时,若是某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;若是容许为核心池中 的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。
2.代码编写:
public class MyThreadpoll { public static void main(String[] args) { ThreadPoolExecutor th = new ThreadPoolExecutor(1, 2, 0L, TimeUnit.MICROSECONDS, new LinkedBlockingQueue<>(3)); for (int i = 0; i < 6; i++) { TaskThread tt = new TaskThread("任务 " + i); th.execute(tt); } th.shutdown(); } } class TaskThread implements Runnable { private String threadName; public TaskThread(String threadName) { this.threadName = threadName; } @Override public void run() { System.out.println(Thread.currentThread().getName() + ": " + threadName); } }
根据上述的原理分析能够看出,当for循环运行到 i = 5时也就是运行第6个线程时,程序抛出异常