线程池具体有哪些拒绝策略
时间: 2023-11-14 07:32:26 浏览: 34
线程池的拒绝策略通常有以下几种:
1. AbortPolicy(默认):直接抛出 RejectedExecutionException 异常,阻止系统正常运行。
2. CallerRunsPolicy:将任务交给调用线程来执行,即在 execute 方法的调用线程中直接执行该任务。这样做可以降低新任务的流量,但是会影响原有任务的执行效率。
3. DiscardOldestPolicy:丢弃队列中最老的一个任务,并尝试再次提交当前任务。
4. DiscardPolicy:直接丢弃任务,不做任何处理。
除了上述几种拒绝策略,还可以通过自定义 RejectedExecutionHandler 接口来实现特定的拒绝策略。自定义 RejectedExecutionHandler 可以通过实现 RejectedExecutionHandler 接口,并重写 rejectedExecution 方法来实现。
相关问题
线程池有哪些拒绝策略
线程池有几种拒绝策略,其中比较常见的有以下几种:
1. ThreadPoolExecutor.AbortPolicy(默认):如果线程池已经达到最大容量且工作队列已满,新提交的任务将会被丢弃并抛出RejectedExecutionException异常。
2. ThreadPoolExecutor.DiscardPolicy:如果线程池已经达到最大容量且工作队列已满,新提交的任务将会被丢弃,但不会抛出任何异常。
3. ThreadPoolExecutor.DiscardOldestPolicy:如果线程池已经达到最大容量且工作队列已满,新提交的任务将会与最早的任务竞争执行权,如果新任务获胜,则最早的任务将会被丢弃。
4. ThreadPoolExecutor.CallerRunsPolicy:如果线程池已经达到最大容量且工作队列已满,新提交的任务将会由提交任务的线程来执行。这种策略可以使提交任务的线程直接参与到任务的执行中,但是可能会导致调用线程的阻塞。
选择使用哪种拒绝策略取决于具体的业务需求和对任务丢失的容忍程度。例如,如果希望确保所有任务都能被执行,可以选择CallerRunsPolicy策略;如果对任务丢失不敏感,希望尽快抛出异常并停止提交新任务,可以选择AbortPolicy策略。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [四种线程池拒绝策略](https://blog.csdn.net/qq_41536778/article/details/114069180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
线程池的四种拒绝策略
线程池的四种拒绝策略分别是:
1. AbortPolicy(中止策略):当线程池无法接受新任务时,会抛出一个拒绝执行的异常信息(RejectedExecutionException),中止任务的执行,并需要处理该异常。这是线程池的默认拒绝策略。
2. CallerRunsPolicy(调用者运行策略):当线程池无法接受新任务时,会使用调用线程直接执行任务。适用于并发较小、性能要求不高的场景,不允许任务失败。然而,如果任务提交速度过快,可能会导致程序阻塞,造成性能上的损失。
3. DiscardPolicy(直接丢弃策略):当线程池无法接受新任务时,直接丢弃当前任务,没有任何提示信息或处理。适用于对任务丢失无关紧要的场景,但需要注意任务的丢失可能会带来潜在的问题。
4. DiscardOldestPolicy(丢弃最老任务策略):当线程池无法接受新任务时,丢弃阻塞队列中最老的一个任务,并将新任务加入队列。适用于对任务响应时间要求较高的场景,丢弃最老任务可以腾出空间来执行新任务。
根据具体的业务场景和需求,可以选择合适的拒绝策略来处理无法接受新任务的情况。一般情况下,使用线程池时,默认采用的是AbortPolicy中止策略。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [线程池-四种拒绝策略总结](https://blog.csdn.net/alan_liuyue/article/details/120995601)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *3* [Java线程池的四种拒绝策略](https://blog.csdn.net/a904364908/article/details/107489854)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]