Com o número crescente de núcleos da CPU, é inevitável o uso da tecnologia de threading múltipla para fazer pleno uso de seu poder de computação. Portanto, a tecnologia de threading multi é uma tecnologia que os desenvolvedores de servidores devem dominar.
A criação e destruição de threads envolvem chamadas do sistema e consome recursos do sistema, portanto, a tecnologia de agrupamento de threads é introduzida para evitar a criação e destruição frequentes de roscas.
Em Java, existe uma classe de ferramentas de executores que pode criar um pool de threads para nós. A essência é para o novo objeto ThreadpoolExector. As piscinas de threads também são uma necessidade de perguntas de entrevistas. Esta seção combina o código -fonte para falar sobre o princípio de trabalho do ThreadExecutor
1. Criação do pool de threads
Vamos primeiro olhar para os parâmetros mais completos do construtor do ThreadPoolExector:
① CorePoolSize: o número de encadeamentos principais no pool de threads. Para ser franco, mesmo que não haja tarefas no pool de threads, haverá threads CorePoolSize aguardando tarefas.
②MaximumPoolSize: o número máximo de threads. Não importa quantas tarefas você envie, o número máximo de threads de trabalhadores no pool de threads é o MaximumPoolSize.
③ KeepaliveTime: O tempo de sobrevivência do tópico. Quando o número de threads no pool de threads é maior que o CorePoolSize, se não houver tarefa a ser executada após aguardar o KeepAliveTime, o thread sai.
⑤unidade: isso é usado para especificar a unidade do KeepaliveTime, como segundos: TimeUnit.Segunds.
⑥ Trabalho de trabalho: uma fila de bloqueio e as tarefas enviadas serão colocadas nesta fila.
⑦ ThreadFactory: uma fábrica de threads, usada para criar threads, principalmente para nomear o thread. O nome do thread de fábrica padrão é o pool-1-thread-3.
⑧ Handler: Rejeitar a política, chamada quando os threads no pool de threads estão esgotados e a fila está cheia.
Os acima são os parâmetros usados ao criar um pool de threads. Os entrevistadores costumam fazer essa pergunta durante as entrevistas.
2. Processo de execução do pool de threads
Aqui está um diagrama para ilustrar o processo de execução do pool de threads
Quando uma tarefa é enviada ao pool de threads, primeiro determinará se o número atual de threads é menor que o CorePoolSize. Se for menor que um thread será criado para executar a tarefa enviada. Caso contrário, a tarefa será colocada na fila de trabalho. Se a câmara de trabalho estiver cheia, determinará se o número atual de threads é menor que o MaximumPoolSize. Se for menor que um thread será criado para executar a tarefa. Caso contrário, um manipulador será chamado para indicar que o pool de threads se recusa a receber a tarefa.
Aqui, pegue o código -fonte do JDK1.8.0_111 como um exemplo para ver a implementação específica.
1. Primeiro olhe para o método do executor do pool de threads
①: determine se o número atual de threads ativos é menor que o CorePoolSize. Se for menor que, ligue para o AddWorker para criar um thread para executar tarefas
②: Se não for menor que o CorePoolSize, adicione a tarefa à fila de trabalho.
③: Se a câmara de trabalho for colocada na cálculo de trabalho, o tópico de criação executará a tarefa. Se o thread de criação falhar no momento (o número atual de threads não for menor que o MaximumPoolSize), a rejeição será chamada (manipulador de chamadas interno) e se recusará a aceitar a tarefa.
2. Vejamos a implementação do método do AddWorker
Este código de código é ao criar um thread não essencial, ou seja, o núcleo é igual a False. Determine se o número atual de threads é maior ou igual a MaximumPoolSize. Se for maior ou igual a false, ou seja, a criação do encadeamento falhou em ③ mencionado acima.
A segunda metade do método Addworker:
① Crie um objeto de trabalhador e instancie um objeto Thread.
②start este tópico
3. Vá ao trabalhador para ver sua implementação
Você pode ver que o ThreadFactory é chamado ao criar um trabalhador para criar um thread. Iniciar um encadeamento no acima ② acionará o método de execução do trabalhador a ser chamado pelo thread.
4. Em seguida, vamos dar uma olhada na lógica do método RunWorker.
O thread chama Runwoker e chamará o método GetTask enquanto LOOP para ler a tarefa do WorkerQueue e, em seguida, executará a tarefa. Desde que o método GetTask não retorne nulo, este thread não sairá.
5. Finalmente, vamos dar uma olhada na implementação do método GetTask
① Vamos ignorar o AllowCorethReadTimeout, o valor padrão dessa variável é falso. WC> CorePoolSize determina se o número atual de threads é maior que o CorePoolSize.
② Se o número atual de threads for maior que o CorePoolSize, o método da pesquisa de trabalho será chamado para obter a tarefa, e o tempo limite será mantido em tempo de tempo. Se o horário do tempo KeepaliveTtime exceder o limite de tempo, a pesquisa retornará nula e o tempo mencionado acima sairá em sequência e o thread será executado.
Se o número atual de threads for menor que o CorePoolSize, o método de Take of WorkQueue será chamado para bloquear no momento.
O artigo acima é baseado no princípio de trabalho e na interpretação do código -fonte do pool de threads. Este artigo é todo o conteúdo compartilhado pelo editor. Espero que possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.