线程池原理解析

一.为什么要使用线程池

线程池原理解析_第1张图片

二.如何使用线程池

1.Diagrams
线程池原理解析_第2张图片
2.编程实现
线程池原理解析_第3张图片

  • newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  • newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  • newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
  • newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

newSingleThreadExecutor实现

public class SingleThreadExecutorTest {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
            try{
                for (int i = 0; i < 10; i++) {
                    threadPool.execute(()->{
                        System.out.println(Thread.currentThread().getName() +"\t 办理业务 ");
                    });
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally{
                threadPool.shutdown();
            }
    }
}

newFixedThreadPool实现

public class ThreadPoolExecutorTest {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);  //1个池子里有五个线程
        try{
            for (int i = 0; i < 10; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"\t 办理业务");
                });
                try {TimeUnit.MILLISECONDS.sleep(400);}catch (InterruptedException e){ e.printStackTrace();}
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            threadPool.shutdown();
        }
    }
}

在点开其源码后,其实都是new的同一个类ThreadPoolExecutor

三.ThreadPoolExecutor分析

线程池原理解析_第4张图片1.七大参数详解

  1. corePoolSize:线程池中常驻核心线程数

  2. maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1

  3. keepAliveTime:多余的空闲线程存活时间。当前线程池数量超过corePoolSize时,当空闲时间到达keepAliveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。

  4. unit:keepAliveTime的时间单位

  5. workQueue:任务队列,被提交但尚未执行的任务

  6. threadFactory:表示生成线程池中的工作线程的线程工厂,用于创建线程,一般为默认线程工厂即可

  7. handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝来请求的Runnable的策略

2.拒绝策略详解

线程池原理解析_第5张图片
3.工作原理
线程池原理解析_第6张图片
1.在创建线程池后开始等待

2.当调用execute()方法添加一个请求任务时,线程池会做出如下判断:
2.1 如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务
2.2 如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列
2.3 如果这个时候队列满了且正在运行的线程数量还小于maximumPoolSize,那么要创建非核心线程立刻运行这个任务
2.4 如果队列满了且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝策略来执行

3.当一个线程完成任务时,它会从队列取下一个任务来执行

4.当一个线程无事可做超过keepAliveTime时线程会判断:
4.1 如果当前运行的线程数大于corePoolSize,那么这个线程就会被停掉
4.2 所有线程池的所有任务完成后,它最终会收缩到corePoolSize的大小

你可能感兴趣的:(线程池,线程池七大参数,线程池原理详解)