Java面试题:线程池的核心参数和工作原理

线程池的核心参数

ThreadPoolExecutor(
	int corePoolSize,
    //核心线程数目
	int MaximumPoolSize,
    //最大线程数=核心线程+临时线程
	long keepAliveTime,
    //临时线程的存活时间,在存活时间内如果没有新任务,线程资源会被释放
	TimeUnit unit,
    //存活时间的时间单位,一个枚举类型
	BlockingQueue<Runnable> workQueue,
    //阻塞队列,如果没有空闲的核心线程时(不会直接叫临时线程来处理),就会将新来的任务放入阻塞队列中等待
	ThreadFactory threadFactory,
    //定制线程对象的创建,没什么用
	RejectedExecutionHandler handler
    //拒绝策略,定义线程都在繁忙且阻塞队列满时对新来任务的处理方式
)

线程池的执行原理

提交任务,

先判断核心线程是否全部繁忙,否->添加到工作线程执行

再判断阻塞队列是否已满,否->添加任务到阻塞队列等待

再判断总线程数是否小于最大线程数,否->创建临时线程执行

(如果核心线程和临时线程空闲时,都会执行阻塞队列里的任务)

按照拒绝策略进行拒绝

拒绝策略

AbortPolicy:直接抛出异常,默认策略
CallerRunsPolicy:用调用者所在的线程(主线程)来执行任务
DiscardOldestPolicy:丢弃阻塞队列最靠前(等待时间最久)的任务来执行当前任务
DiscardPolicy:直接丢弃任务
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池Java中用于管理和复用线程的机制,它可以提高线程的利用率和性能。线程池的七大参数包括: 1. corePoolSize(核心线程数):线程池中始终保持的线程数量,即使它们处于空闲状态。当任务数量超过核心线程数时,线程池会创建新的线程来处理任务。 2. maximumPoolSize(最大线程数):线程池中允许存在的最大线程数量。当任务数量超过最大线程数时,新的任务会被放入等待队列中等待执行。 3. keepAliveTime(线程空闲时间):当线程池中的线程数量超过核心线程数时,多余的空闲线程在等待新任务到来时的最长等待时间。超过这个时间,空闲线程会被销毁。 4. unit(时间单位):用于设置keepAliveTime的时间单位,可以是秒、毫秒、分钟等。 5. workQueue(任务队列):用于存放等待执行的任务的队列。常见的队列类型有有界队列(如ArrayBlockingQueue)和无界队列(如LinkedBlockingQueue)。 6. threadFactory(线程工厂):用于创建新线程的工厂类。可以自定义线程的名称、优先级等属性。 7. handler(拒绝策略):当任务无法被线程池执行时的处理策略。常见的策略有直接抛出异常、丢弃任务、丢弃队列中最旧的任务等。 线程池的作用主要有以下几点: 1. 提高性能:线程池可以复用线程,避免了频繁创建和销毁线程的开销,提高了系统的性能。 2. 控制资源:通过设置核心线程数和最大线程数,可以控制系统中并发线程的数量,避免资源被过度占用。 3. 提供任务队列:线程池可以提供一个任务队列,用于存放等待执行的任务。当线程池中的线程都在执行任务时,新的任务会被放入队列中等待执行。 4. 管理线程:线程池可以统一管理线程的生命周期,包括创建、销毁、空闲时间等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值