Entrevistador: Quais são os métodos de construção e estratégias de rejeição do pool de threads?

Em Java, o pool de encadeamentos é uma ferramenta poderosa para gerenciar encadeamentos para melhorar o desempenho e reduzir o consumo de recursos. Este artigo apresentará o método de construção do pool de threads, o tipo de pool de threads e a estratégia de rejeição do pool de threads.

Como construir um pool de threads

JavaO pool de threads é construído  principalmente por meio de java.util.concurrent.ExecutorServiceinterfaces e suas classes de implementação . ThreadPoolExecutorA seguir estão vários métodos de construção comuns:

  1. Usar Executorsmétodos de fábrica de classes: ExecutorsA classe fornece uma série de métodos de fábrica estáticos para criar pools de encadeamentos, como newFixedThreadPool, newCachedThreadPoole newSingleThreadExecutor.

  2. Crie ThreadPoolExecutoruma instância diretamente: você pode instanciar diretamente ThreadPoolExecutoruma classe e passar uma série de parâmetros para criar um pool de threads, como o número de threads principais, o número máximo de threads, o tempo de sobrevivência de threads ociosos, unidades de tempo, filas de tarefas , etc

Tipos de pools de threads

Java O pool de threads pode ser dividido nos seguintes tipos:

  1. Conjunto de encadeamento fixo ( FixedThreadPool): O conjunto de encadeamento fixo tem um número fixo de encadeamentos principais e o número máximo de encadeamentos é o mesmo que o número de encadeamentos principais. Esse pool de encadeamentos é adequado para lidar com um número fixo de tarefas simultâneas.

  2. Conjunto de encadeamentos em cache ( CachedThreadPool): O número de encadeamentos principais no conjunto de encadeamentos em cache é 0 e o número máximo de encadeamentos é Integer.MAX_VALUE. Quando uma nova tarefa chegar, se houver uma thread ociosa, ela será reutilizada, caso contrário, uma nova thread será criada. Threads ociosos são reciclados após um certo período de tempo. Esse pool de encadeamentos é adequado para cenários em que um grande número de tarefas de curto prazo é executado.

  3. Executor de thread único ( SingleThreadExecutor): Um executor de thread único tem apenas um thread principal e o número máximo de threads também é 1. As tarefas serão executadas sequencialmente, o que é adequado para cenários que exigem execução serial de tarefas.

  4. Pool de threads de temporização ( ScheduledThreadPool): O pool de threads de temporização permite a sincronização ou a execução periódica de tarefas. Ele herda ThreadPoolExecutore implementa ScheduledExecutorServicea interface.

A política de rejeição do pool de threads

线程池的拒绝策略当线程池中的线程达到最大线程数且任务队列已满时,线程池会采用拒绝策略来处理新到来的任务。Java 中的有以下几种:

  1. AbortPolicy(默认拒绝策略):直接抛出RejectedExecutionException异常,表示任务无法处理。

  2. CallerRunsPolicy:调用任务的提交者所在的线程来执行任务。这种策略可以降低新任务提交的速度,从而为线程池腾出时间处理已提交的任务。

  3. DiscardPolicy:该策略直接丢弃新到来的任务,不抛出异常。如果你可以容忍某些任务不被执行,这种策略可能会很有用。

  4. DiscardOldestPolicy:该策略会丢弃任务队列中等待时间最长的任务,然后尝试提交新任务。这种策略在任务队列可能存在低优先级任务时较为实用。

  5. 自定义拒绝策略:你还可以实现RejectedExecutionHandler接口来自定义拒绝策略。例如,可以记录被拒绝的任务,以便稍后分析和处理。

总结

线程池在 Java 中是一个强大的工具,可以帮助我们管理和控制线程的执行。了解不同类型的线程池及其适用场景以及拒绝策略可以帮助我们更有效地使用线程池。在实际应用中,我们应根据需求选择合适的线程池类型和拒绝策略,以实现高效、稳定的并发执行。

Acho que você gosta

Origin juejin.im/post/7215424831209635901
Recomendado
Clasificación