线程池处理任务流程

  • 线程池处理任务流程:

    1. 如果当前运行的线程数小于核心线程数,那么就会新建一个线程来执行任务
    2. 如果当前运行的线程数等于或大于核心线程数,但是小于最大线程数,那么就把该任务放入到任务队列里等待执行。
    3. 如果向任务队列投放任务失败(任务队列已经满了),但是当前运行的线程数是小于最大线程数的,就新建一个线程来执行任务。
    4. 如果当前运行的线程数已经等同于最大线程数了,新建线程将会使当前运行的线程超出最大线程数,那么当前任务会被拒绝,拒绝策略会调用RejectedExecutionHandler.rejectedExecution()方法。
  • 线程池在提交任务前,可以提前创建线程吗?

    • 答案是可以的!ThreadPoolExecutor提供了两个方法帮助我们在提交任务之前,完成核心线程的创建,从而实现线程池预热的效果:
      • prestartCoreThread():启动一个线程,等待任务,如果已达到核心线程数,这个方法返回false,否则返回true;
      • prestartAllCoreThreads():启动所有的核心线程,并返回启动成功的核心线程数