Código-fonte deste artigo: GitHub · clique aqui || GitEE · clique aqui
Um, mapa multi-thread
2. Noções básicas de multithreading
1. Conceitos básicos
Um thread é a menor unidade que o sistema operacional pode executar o agendamento da operação, incluída no processo, e é a unidade operacional real no processo. Um thread se refere a um único fluxo de controle sequencial em um processo. Vários threads podem ser simultâneos em um processo, e cada thread executa tarefas diferentes em paralelo.
2. Método de criação
Herde a classe Thread, implemente a interface Runnable, com base nas interfaces Callable e Future, e Timer é um thread em segundo plano e um pool de threads.
3. Status da linha
Descrição do estado: estado inicial, estado de execução, estado de bloqueio, estado de espera, estado de espera de horas extras e estado de término.
4. Mecanismo de execução
Um aplicativo na JVM pode ser executado em paralelo por vários encadeamentos. Os encadeamentos são mapeados um a um para o encadeamento do sistema operacional onde o serviço está localizado, planejado para ser executado na CPU disponível e um encadeamento do sistema operacional é criado na inicialização; quando o encadeamento termina, isso Os threads do sistema operacional também serão reciclados.
5. Modelo de memória
Quando a máquina virtual é iniciada e executada, vários threads são criados. Alguns módulos na área de dados são compartilhados por threads e alguns são privados:
Compartilhamento de thread: área de metadados, heap;
Thread privado: pilha de máquina virtual, pilha de método local, contador de programa;
Uma única CPU pode executar apenas um thread em um momento específico, portanto, vários threads usam vários blocos de espaço e competem constantemente pelo período de execução da CPU.
Três, conceitos comuns
1. Prioridade do tópico
O agendador de encadeamentos tende a executar encadeamentos com alta prioridade de encadeamento. A alta prioridade de encadeamento indica que a probabilidade de adquirir recursos da CPU é alta ou os fragmentos de tempo de execução adquiridos são altos e a probabilidade de execução é alta, mas não significa que a baixa prioridade deve ser executada por último.
2. Tópico do Daemon
O encadeamento daemon suporta encadeamentos auxiliares, que desempenham principalmente uma função de agendamento e suporte no programa.Quando todos os encadeamentos não-daemon no Jvm terminarem, o encadeamento daemon também será encerrado.
3. Thread join
No encadeamento A, execute o método de junção do encadeamento B, então o encadeamento A esperará que o encadeamento B termine a execução antes de retornar para continuar a execução.
4. Tópico local
ThreadLocal também é chamada de variável local do thread. Ela cria uma cópia da variável em cada thread. Cada thread pode acessar sua própria variável de cópia interna, e os threads não afetam uns aos outros.
Quarto, thread safety
Do ponto de vista de como as threads e o espaço de memória são ocupados na figura acima, é necessário garantir a segurança das threads quando as threads acessam o bloco de memória compartilhada.
1. Controle síncrono
Sincronizado controle de sincronização de palavras-chave, pode modificar métodos, modificar blocos de código, modificar métodos estáticos, etc., recursos de controle de sincronização são poucos, pode melhorar a eficiência de multithreading.
2. Mecanismo de bloqueio
Interface de bloqueio: uma das interfaces raiz para bloqueio de recursos na programação simultânea Java, que especifica vários métodos básicos para bloqueio de recursos.
Classe ReentrantLock: Bloqueio reentrante que implementa a interface Lock, ou seja, se um thread adquire o bloqueio da instância atual e entra no método de tarefa, pode entrar no método de tarefa novamente sem liberar o bloqueio. Características: exclusão mútua, a saber Apenas um thread entra na tarefa por vez.
Interface de condição: descreve as variáveis de condição que podem ser associadas ao bloqueio e fornece funções mais poderosas.Por exemplo, Conditon pode implementar várias notificações e notificações seletivas no mecanismo de espera / notificação de thread.
3. Palavras-chave voláteis
Volatile modifica variáveis de membro e não pode modificar o método, ou seja, quando o thread acessa esta variável, ela precisa ser obtida da memória compartilhada. As modificações na variável também precisam ser liberadas para a memória compartilhada de forma síncrona, garantindo a visibilidade da variável para todos os threads.
Cinco, discussão de comunicação
Um thread é uma entidade independente, mas no processo de execução do thread, se a mesma lógica de negócios for processada, pode ocorrer contenção de recursos, resultando em problemas de simultaneidade e até mesmo deadlock.A coordenação entre os threads requer um mecanismo de comunicação para garantir.
1. Método básico
O método relacionado é o método básico do nível de Objeto em Java, e qualquer objeto tem este método: notificar () informa aleatoriamente um encadeamento esperando que o objeto termine o estado de espera e retorne; o encadeamento wait () entra no estado de espera, ele não Competindo pelo objeto de bloqueio, você também pode definir o tempo de espera;
2. Mecanismo de espera / notificação
Mecanismo de espera / notificação. Neste modo, o thread A chama o método wait () do objeto para entrar no estado de espera quando a execução da tarefa não for satisfeita. O thread B modifica a condição de execução do thread A e chama o método notificar () ou notificarAll () do objeto , O Thread A retorna do estado de espera após receber a notificação e, em seguida, executa as operações subsequentes. Os dois threads completam a interação entre espera e notificação por meio de wait () / notificação () / notificaçãoAll () fornecida pelo objeto, o que melhora a escalabilidade do programa.
3. Comunicação do fluxo do pipeline
O fluxo do pipeline é usado principalmente para transferir dados diretamente entre diferentes threads. Um thread envia dados para o canal de saída e o outro thread lê os dados do canal de entrada, realizando assim a comunicação entre diferentes threads.
Seis, pool de threads
1. Interface do Executor
No sistema Executor, o envio de tarefa de thread e a execução de tarefa são projetados para serem separados. O Executor tem várias classes de implementação poderosas que fornecem maneiras convenientes de enviar tarefas e obter resultados de execução de tarefas, encapsulando o processo de execução de tarefas, e não precisam mais dele O método Thread (). Start () cria threads explicitamente e executa tarefas associadas a elas.
2. Parâmetros principais
3. Classes de API relacionadas
Tarefa do pool de threads: interface principal: Runnable, Callable interface e classe de implementação de interface;
O resultado da tarefa: interface Future e classe de implementação FutureTask;
Execução da tarefa: interface central Executor e interface ExecutorService. Na estrutura do Executor, existem duas classes principais que implementam a interface ExecutorService, ThreadPoolExecutor e ScheduledThreadPoolExecutor.
Sete, API de thread comum
1. Mecanismo de bifurcação / união
A estrutura Fork / Join é usada para executar tarefas em paralelo. A ideia central é dividir uma tarefa grande em várias tarefas pequenas e, em seguida, resumir os resultados da execução de cada tarefa pequena para obter o resultado final da tarefa grande. Processo central: tarefas divididas, execução assíncrona de tarefas de módulo e mesclagem de resultados de tarefa única.
2. Container
ConcurrentHashMap: Use o mecanismo de bloqueio de segmento para dividir os dados no contêiner em segmentos e armazená-los em segmentos e, em seguida, atribuir um bloqueio a cada segmento de dados. Quando um encadeamento ocupa o bloqueio para acessar um segmento de dados, os dados em outros segmentos também podem ser usados por outros segmentos. Acesso à thread, considerando segurança e eficiência de execução.
ConcurrentLinkedQueue: *** fila thread-safe com base em nós de link, classifica os elementos de acordo com o princípio FIFO, a cabeça da fila é o elemento com o tempo mais longo na fila e a cauda da fila é o elemento com o tempo mais curto na fila, novo O elemento é adicionado ao final da fila e a operação get element é obtida do início da fila.
3. Atômico
O JDK vem com classes de operação atômica, que tratam da operação simultânea de uma variável por vários threads, incluindo: tipos básicos, tipos de array, tipos de referência e tipos de modificação de atributo.
Oito, cenários de aplicação
1. Tarefas cronometradas
Por meio das definições de configuração, alguns programas são executados regularmente em um determinado ponto de tempo ou tempo de ciclo.A execução de tarefas aqui é baseada na tecnologia multithreading.
2. Processamento assíncrono
O processamento assíncrono significa que o programa não é executado de acordo com o bloco de código síncrono atual. O processamento assíncrono e o processamento síncrono são opostos. A realização do assíncrono também requer vários threads ou vários processos para melhorar a eficiência do programa.
3. Decomposição de tarefas
Operações comuns em bancos de dados distribuídos. Os dados são distribuídos em cópias de bancos de dados diferentes. Ao realizar uma consulta, cada serviço deve executar uma tarefa de consulta e, finalmente, mesclar os dados em um serviço ou fornecer uma camada intermediária de mecanismo para agregação Dados, em tarefas de temporização de grande escala, as tarefas a serem processadas são frequentemente fragmentadas de acordo com uma estratégia específica e vários threads são processados ao mesmo tempo.
4. Tecnologia de pool de conexão
A tecnologia de criação e gerenciamento de um buffer pool de conexões, essas conexões estão prontas para serem utilizadas por qualquer encadeamento que precise delas, reduzindo o problema de criação e liberação contínua de conexões e melhorando a eficiência do programa.
Nove, endereço do código-fonte
GitHub·地址
https://github.com/cicadasmile
GitEE·地址
https://gitee.com/cicadasmile
Leitura recomendada: sistema de programação de acabamento
Número de série | Nome do Projeto | Endereço GitHub | Endereço GitEE | Recomendado | |
---|---|---|---|---|---|
01 | Java descreve padrões de design, algoritmos e estruturas de dados | GitHub · clique aqui | GitEE · Clique aqui | ☆☆☆☆☆ | |
02 | Fundação Java, simultaneidade, orientado a objetos, desenvolvimento web | GitHub · clique aqui | GitEE · Clique aqui | ☆☆☆☆ | |
03 | Explicação detalhada do caso do componente básico do microsserviço SpringCloud | GitHub · clique aqui | GitEE · Clique aqui | ☆☆☆ | |
04 | Caso abrangente de arquitetura de microsserviço SpringCloud | GitHub · clique aqui | GitEE · Clique aqui | ☆☆☆☆☆ | |
05 | Introdução ao aplicativo básico do framework SpringBoot para avançado | GitHub · clique aqui | GitEE · Clique aqui | ☆☆☆☆ | |
06 | O framework SpringBoot integra e desenvolve middleware comum | GitHub · clique aqui | GitEE · Clique aqui | ☆☆☆☆☆ | |
07 | Caso básico de gerenciamento de dados, distribuição, design de arquitetura | GitHub · clique aqui | GitEE · Clique aqui | ☆☆☆☆☆ | |
08 | Série de Big Data, armazenamento, componentes, computação e outras estruturas | GitHub · clique aqui | GitEE · Clique aqui | ☆☆☆☆☆ |