线程池总结

线程池

线程池是一种用于管理和复用线程的技术,它可以提高系统性能和资源利用率。线程池的核心原理是预先创建一定数量的线程,并将这些线程用于执行任务,从而避免了频繁创建和销毁线程的开销。

线程池的核心参数

  • 核心线程数(corePoolSize)
    • 作用: 定义了线程池中始终保持活动的线程数量,即使这些线程处于空闲状态也不会被回收。它确保线程池在高负载时能够快速响应。
    • 工作流程: 当提交任务时,如果线程池中的线程数少于核心线程数,会创建新的线程执行任务,即使任务队列尚未满。核心线程数可以在构造线程池时设定。
  • 最大线程数(maximumPoolSize)
    • 作用: 定义了线程池中可以创建的最大线程数量。超出核心线程数的线程会被创建来处理任务,当任务队列满时,新的线程可以被创建,直到达到最大线程数。
    • 工作流程: 当任务队列满且线程数小于最大线程数时,线程池会创建新的线程来处理任务。如果线程数达到最大值,线程池会采取其他策略,如拒绝任务。
  • 线程空闲时间(keepAliveTime)
    • 作用: 定义了非核心线程在空闲状态下保持活动的最长时间。如果空闲线程超过这个时间,它们会被终止并从线程池中移除。
    • 工作流程: 当线程池中存在超过核心线程数的线程且这些线程处于空闲状态,线程池会在空闲时间达到设定值后回收这些线程。对于核心线程,这个参数通常不起作用。
  • 时间单位(unit)
    • 作用: 定义了 keepAliveTime 的时间单位,如秒、毫秒等。它用于设置线程空闲时间的单位。
    • 工作流程: 时间单位用于将 keepAliveTime 转换为实际的时间值,以便线程池能够正确地管理线程的生命周期。
  • 任务队列(workQueue)
    • 作用: 用于存放等待执行的任务。任务队列可以是不同类型的数据结构,如 LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue 等。
    • 工作流程: 当提交任务时,任务会被放入任务队列中。如果线程池中的核心线程数已满,任务会被排入队列,等待线程处理。如果队列满且线程数小于最大线程数,会创建新线程处理任务。
  • 线程工厂(threadFactory)
    • 作用: 用于创建新的线程。可以通过实现 ThreadFactory 接口自定义线程的创建过程,例如设置线程名称、优先级等。
    • 工作流程: 当需要创建新线程时,线程池会使用提供的 ThreadFactory 来生成线程。这有助于自定义线程的属性和行为。
  • 拒绝策略(handler)
    • 作用: 当线程池无法处理新提交的任务时,拒绝策略决定如何处理这些任务。常用的拒绝策略包括 AbortPolicy、CallerRunsPolicy、DiscardPolicy 和 DiscardOldestPolicy。
    • 工作流程: 如果任务队列和线程池达到最大容量并且无法再创建新线程,线程池会调用拒绝策略来处理这些任务。例如,AbortPolicy 会抛出 RejectedExecutionException,而 CallerRunsPolicy 会由提交任务的线程直接执行任务。

线程池的核心方法

  • execute(Runnable command)
    • 作用: 提交一个任务用于执行。与 submit 方法不同,它不返回结果。
    • 工作流程: 如果线程池中有空闲线程,会直接执行任务;否则,任务会被放入任务队列中。如果任务队列满且线程池未达到最大线程数,会创建新线程处理任务。
  • submit(Runnable task)
    • 作用: 提交一个任务并返回一个 Future 对象,可以用于获取任务的执行结果或检查任务是否完成。
    • 工作流程: 任务会被提交到线程池中,如果线程池有空闲线程,会执行任务;否则,任务会被放入任务队列中。提交任务时会返回一个 Future 对象。
  • submit(Callable task)
    • 作用: 提交一个 Callable 任务并返回一个 Future 对象,可以用于获取任务的返回值。
    • 工作流程: 任务会被提交到线程池中,如果线程池有空闲线程,会执行任务;否则,任务会被放入任务队列中。提交任务时会返回一个 Future 对象。
  • shutdown()
    • 作用: 启动线程池的正常关闭过程。线程池会等待所有已提交的任务执行完成,并拒绝接受新的任务。
    • 工作流程: 调用 shutdown() 后,线程池会停止接收新的任务,并开始执行任务队列中的任务。所有核心线程会被保留,直到队列中的任务执行完成。
  • shutdownNow()
    • 作用: 尝试立即关闭线程池。会中断正在执行的任务,并返回尚未执行的任务列表。
    • 工作流程: 调用 shutdownNow() 后,线程池会尝试中断正在执行的任务,取消尚未执行的任务,并关闭线程池。返回的任务列表包含所有未执行的任务。
  • awaitTermination(long timeout, TimeUnit unit)
    • 作用: 等待线程池关闭完成的最长时间。如果线程池在指定时间内完成关闭,返回 true,否则返回 false。
    • 工作流程: 调用 awaitTermination() 后,线程池会在指定的时间内等待所有任务完成。超时时间可以是秒、分钟等,直到线程池完全关闭或超时。
  • getPoolSize()
    • 作用: 获取当前线程池中线程的数量。
    • 工作流程: 返回当前线程池中实际活动的线程数量,包括核心线程和非核心线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值