java线程池的七个参数详解

tech2022-09-28  62

java线程池的七个参数

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) corePoolSize(线程池核心线程大小): 线程池中维护的一个最少的线程数量,即使这些线程处于空闲状态,他们也不会被销毁,除非设置了allowCoreThreadTimeOut。maximumPoolSize(线程池最大线程数量):一个任务被提交到线程池之后,首先会到缓存到工作队列中,如果工作队列满了,则会创建一个新的线程,然后从工作队列中取出一个任务交给新线程处理,而将刚提交上来的任务放入到工作队列中。线程池不会无限制的创建新线程,它会有一个最大的线程数量限制,这个数量由maximunPoolSize来指定。keepAliveTime(空闲线程存活时间):一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定的时间后,这个空闲的线程将被销毁,这个指定的时间就是keepAliveTime。unit(空闲线程存活时间单位):keepAliveTime的计量单位。workQueue(工作队列):新任务被提交之后,会先进入到此工作队列中,任务调度时再从队列中取出任务。jdk一共提供了四种工作队列: ArrayBlockingQueue:基于数组的有界阻塞队列,按照FIFO排序。新任务进来之后,会被放到该队列的队尾,有界的数组可以防止资源被耗尽问题。当线程池中的线程数量达到corePoolSize后,再有新任务进来,则会将任务放到该队列的队尾,等待被调度。如果队列已经满了的话,则创建一个新线程,如果线程数量已经达到maximumPoolSize,则会执行拒绝策略。LinkedBlockingQuene:基于链表的无界阻塞队列,(其实最大的容量是Interger.MAX),按照FIFO排序。由于该队列的近似无界性,当线程池中线程的数量达到corePoolSize后,再有新的任务进来,会一直存在在这个队列,而不会创建新的线程直到maximumPoolSize,因此使用这个工作队列的时候,参数maximumPoolSize其实是不起作用的。SynchronousQuene:一个不缓存任务的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务。也就是说新任务进来的时候,不会缓存,而是直接被调度执行该任务,如果没有可用的线程,则创建新的线程,如果线程达到了maximumPoolSize,则执行拒绝策略。PriorityBlockingQueue:具有优先级的无界阻塞队列,优先级通过Comparator实现。 threadFactory(threadFactory 线程工厂):创建新线程的时候使用的工厂,可以用来指定线程名,是否为daemon线程等等。handler(拒绝策略):当工作队列中的任务已经达到了最大的限制,并且线程池中线程数量达到了最大限制,如果这时候有新任务进来,就会采取拒绝策略,jdk中提供了四种拒绝策略:
最新回复(0)