你是如何评估一个线程池需要设置多少个线程
|
拒绝策略 1.2 向线程池提交任务时线程创建过程 那当用户向线程池提交一个任务的时候,线程池会如何创建线程呢? 首先线程池会判断当前已创建的线程是否小于 corePoolSize (核心线程数),如果小于,则无论已创建的线程是否空闲,都会选择创建一个新的线程来执行该任务,直到已创建的线程等于核心线程数。 当线程池中已创建的线程数等于核心核心线程数时,用户继续向线程池提交任务时,此时会先判断任务队列是否已满: 1)如果任务队列未满,则将任务放入队列中。 2)如果任务队列已满,则判断当前线程数量是否超过了最大线程数量,如果未超过,则创建一个新的线程来执行该任务,如果线程池已创建的线程数量等最大线程数,则执行拒绝策略。 温馨提示:所以如果线程池使用的队列无界队列,最大线程数会变的没有意义。 1.3 线程池的拒绝策略、使用场景 JUC 默认提供了如下拒绝策略:
拒绝,直接抛出 RejectedExecutionException,默认值。
由调用线程直接运行任务的 run 方法,即异步转同步。
丢弃任务队列中最先进入的任务。
拒绝了,就不执行,“当没事人事”样。 拒绝策略触发的条件:线程池使用的是有界任务队列时,才有可能被触发,当队列已满,并且线程池创建的线程已经达到了最大允许的线程池时。 默认情况下,通常使用 AbortPolicy 即可。 CallerRunsPolicy 异步转同步在出现拒绝的情况下其实意义不大,没有想出其合适的场景,因为需要执行拒绝策略的时候,已经处理变慢了,再同步执行任务,只会增加服务器的负载,不利于恢复问题。 DiscardOldestPolicy 这种策略,通常用于类似记录轨迹,偶尔丢失点数据没关系,但希望最新的数据能得到保存。 DiscardPolicy 策略,通常用来异步打印日志,直接忽略不执行,期望保存旧的数据。 1.4 如何选择阻塞队列 阿里内部的开源规范明确禁止使用无界队列,如果使用无界队列,任务会不受限制的往线程池中提交,有可能造成内存溢出。 如果使用无界队列,最大线程数这个参数将会失效,因为永远也不会创建多于核心线程数量的线程。 1.5 线程池工厂有何实际用处 ThreadFactory threadFactory,线程池工厂,在使用线程池时,强烈推荐使用自己定义的线程工厂,这样能为线程池中的线程进行命名,方便跟大家使用 jsatck 命令查看线程栈时,能快速识别对应的线程。 1.6 keepAliveTime参数的作用 keepAliveTime :通俗点来说,这个参数表示线程的最大空闲时间,即如果线程没有在执行任务,能存活的时间。 默认情况下,该参数只针对超过核心线程数(corePoolSize) 的线程,可通过将allowCoreThreadTimeOut设置为true,则核心线程数也会因为空闲而被关闭。 2、如何为线程池设置合适的线程目前根据我看过的一些开源框架,设置多少个线程数量通常是根据应用的类型:IO密集型、CPU密集型。
实际情况往往复杂的多,并不会按照这个进行设置,上面的公式通常适合框架类,例如netty,dubbo这种底层通讯框架通常会参考上述标准进行设置。
关于在实际业务开发中,如何为一个线程池设置合适的线程呢? (编辑:唐山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


