您的购物车目前是空的!
JAVA线程池
ThreadPoolExecutor
参数:corePoolSize,核心线程数
参数:maximumPoolSize,最大线程数
参数:keepAliveTime,非核心线程空闲状态的存活时间
参数:unit,对应参数keepAliveTime的时间单位
参数:workQueue,工作队列
参数:threadFactory,线程工厂(用于创建线程)
参数:handler,拒绝策略
问题一:如果maximumPoolSize大于corePoolSize的情况下,临时线程在什么情况下才会创建?
答:当核心线程创建满且阻塞队列满时才会创建临时线程,临时线程会执行最新的任务而不是队列中的任务。通过上述内容也可以得出,一个线程池任务处理的最大量为:maximumPoolSize+workQueue的大小。
问题二:临时线程什么时候会被销毁?
答:当所有任务已被执行完成或核心线程已经足够消化所有任务或核心线程加工作队列可以完全消化/存放所有任务时且临时线程已经超过了其设置的存活时间,临时线程会被销毁。
问题三:当任务被放进线程池执行时,它被执行的流程是什么样的?
答:当一个任务被丢进线程池进行执行时,线程池首先会判断核心线程数有没有到达设置的最大值,如果没有,则创建一个核心线程并执行任务。如果核心线程数到达了设置的最大值,则判断工作队列是否已满,如果没有,则将任务放进工作队列等待执行。如果工作已满,则判断线程池是否已到达了最大线程数,如果没有,则创建临时线程执行任务(注意该任务是最新放进来的那个任务,而不是之前放入队列中的任务)。如果线程池线程数已经到了最大数量,则根据设定的拒绝策略进行拒绝。
问题四:java提供的几种拒绝策略
答:四种。AbortPolicy,直接丢弃任务并抛出一个拒绝异常;CallerRunsPolicy,将任务丢给主线程去执行;DiscardPolicy,直接丢弃任务但不会抛出异常;DiscardOldestPolicy,丢弃最早的一个未处理任务。