当把一个线程池核心线程数设置为 0,最大线程数设置为 100,此时当任务到达会怎么运行?
题目详细答案
当你将一个线程池的核心线程数设置为 0,最大线程数设置为 100 时,线程池的行为主要取决于其工作队列和拒绝策略。
当核心线程数为 0的时候:这意味着线程池在没有任务时不会维持任何空闲线程。只有在有任务到达时,线程池才会尝试创建线程来执行任务。
最大线程数为 100:这是线程池能够创建的最大线程数量。当任务数超过核心线程数时,线程池会继续创建新线程,直到达到最大线程数。
重点就是任务到达时的行为:
1、如果工作队列为空:当一个新任务到达时,由于核心线程数为 0,线程池不会立即创建核心线程,而是直接将任务放入工作队列中。
2、如果工作队列已满:当工作队列已满时,线程池会尝试创建新的线程来处理任务,直到线程数达到最大线程数。
3、如果线程数已达到最大线程数:如果线程数已经达到了最大线程数并且工作队列也满了,那么新到达的任务将根据线程池的拒绝策略进行处理(例如,抛出异常、丢弃任务、丢弃最旧的任务或调用任务的rejectedExecutionHandler方法)。
具体的行为还取决于工作队列的类型和大小:
有界队列:如果使用的是有界队列(例如ArrayBlockingQueue),当队列已满时,新的任务会触发线程池创建新的线程,直到达到最大线程数。超过最大线程数的任务将根据拒绝策略处理。
无界队列:如果使用的是无界队列(例如LinkedBlockingQueue),线程池将优先将任务放入队列中,而不是创建新线程。因此,线程数可能不会达到最大线程数,除非队列的任务处理速度跟不上任务到达的速度。
总结当核心线程数为 0,最大线程数为 100 时,线程池在任务到达时会首先尝试将任务放入工作队列中。如果队列已满,则会创建新的线程来处理任务,直到达到最大线程数 100。如果线程数已达到最大并且队列也满了,则会根据拒绝策略处理新任务。
原文: https://www.yuque.com/jingdianjichi/xyxdsi/agopenygvg84ny3z