Segmento pool de política de negar
- AbortPolicy : direto jogado impedir que o sistema funcionando corretamente.
- CallerRunsPolicy : Enquanto o pool de threads não está fechada, a política directamente no segmento do chamador, executar a tarefa atual é descartado.
- DiscardOldestPolicy : descartar o pedido mais antigo, tente enviar o trabalho atual novamente.
- DiscardPolicy : descarte não pode lidar com a tarefa, nem dado qualquer tratamento.
- Se você quiser personalizar a interface para rejeitar estratégia pode alcançar RejectedExecutionHandler
Como usar um pool de bom fio
O número de configurações de tamanho de rosca
De computação intensiva
- Como o nome sugere é a aplicação requer uma grande quantidade de recursos de computação CPU, multi-core era CPU, temos que deixar que cada núcleo da CPU estão envolvidos no cálculo, o desempenho da CPU totalmente utilizada, este não é considerado um desperdício de configuração do servidor, se você configurar um muito bom servidor também em execução em um programa single-threaded que será apenas como resíduo uma grande
- Para aplicações de computação intensiva, a obra inteiramente sobre o número de core CPU, por isso, a fim de torná-lo desempenhar plenamente as vantagens, evitar a troca de contexto fio excessiva, a solução ideal é: o número de linhas = número um núcleo da CPU , também pode ser definido como número do núcleo da CPU * 2 , mas depende da versão do JDK, e as configurações da CPU (CPU do servidor tem Hyper-threading)
IO-intensiva
- É bem compreendido, e acima de tudo que estamos fazendo para desenvolver aplicações web, envolvendo grandes quantidades de tráfego de rede, não só isso, com o banco de dados, interação entre o cache e também envolve IO, IO uma vez ocorrido, em um segmento irá aguardar estado, quando o fim IO, os dados estão prontos, o segmento continuará
- Portanto, pode ser encontrada aqui para aplicações intensivas de IO, podemos definir o número de multi-threaded parte do pool de threads, de modo que podemos fazer neste momento para esperar por IO, o fio pode fazer outras coisas, para melhorar a eficiência de processamento simultâneo. Em seguida, a quantidade de dados que não é thread pool pode facilmente configurá-lo? Claro que não, certifique-se de lembrar que a troca de contexto fio a um preço
- Actualmente resumiu uma fórmula para aplicações de uso intensivo de IO: tópicos = núcleos de CPU / (l factor de bloqueio) Este factor de bloqueio é geralmente 0,8 a 0,9, 0,8 ou 0,9 podem ser tomadas. Aplicar a fórmula para uma CPU dual-core, que é o número ideal de threads é 20, é claro, não é absoluta, é necessário de acordo com a situação real para ajustar e negócio real: int final do poolSize = (int) (cpuCore / (1-0,9) )
parâmetros de configuração conjunto de encadeamentos
- Use o pool de threads quando eles não são selecionados nenhum limite superior de itens de configuração. Primeiro, nós não usar nenhum pool de threads superior e definir a fila ilimitada ! Por exemplo, definir a fila set ilimitada newCachedThreadPool por causa de algumas circunstâncias imprevistas, o pool de threads sistema será anormal, levando a surtos tópicos situação ou fila de tarefas continua a se expandir, levando a falhas no sistema de exaustão de memória e exceções. Recomendamos a utilização dos primeiros princípios de um pool de threads personalizado para evitar este problema, que é o padrão no pool de threads
- Definir um número razoável de threads, e passe o tempo ocioso para se recuperar , a ser definido de acordo com os ciclos de execução de tarefas específicas e tempo, evitar a recuperação frequente e criação , embora o nosso objectivo é usar o pool de threads é para melhorar o desempenho do sistema e taxa de transferência, mas também considerar sob a estabilidade do sistema , problemas de outra forma inesperados surgem será muito problemático
- De acordo com a cena real, escolha adequada para a sua política de rejeição . Para compensar, não mexer com suporte mecanismo JDK compensação automática ! Tente usar táticas personalizados recusou-se a revelar todos os detalhes foram
Ligar o seu uso do comportamento incorporado
- Use Hook, deixando o pool de threads para executar a trilha: ThreadPoolExecutor fornece um método gancho protegido tipo pode ser substituído, permitindo ao usuário a tarefa antes da execução e após a execução de fazer alguma coisa.
- Podemos usá-lo para alcançar tal inicialização ThreadLocal, reunir estatísticas, tais como a exploração madeireira e outras operações. BeforeExecute tais como Hook and AfterExecute.
- Há também um gancho pode ser usado quando a tarefa for concluída a execução lógica é permite ao usuário inserir, como rerminated. Se a execução do método gancho falhar, o trabalho da rosca interna irá falhar ou ser interrompido
Feche o pool de threads
- Quando o conteúdo do pool de threads não é citada e o número de threads de trabalho é 0, o pool de threads será encerrado. Também pode chamar o desligamento terminar manualmente o pool de threads . Se esquecer de chamar o desligamento, a fim de permitir que os recursos de rosca são liberados, também podemos usar KeepAliveTime e allowCoreThreadTimeOut para atingir seus objetivos! Claro, a abordagem prudente é usar uma máquina virtual Runtime.getRuntime (). AddShutdownHook método, mão para chamar o método close do pool de threads