O conceito de threading java <r />, ao contrário da maioria das outras linguagens de computador, o Java suporta programação multithread em embutido.
Um programa multithread contém duas ou mais peças que são executadas simultaneamente. Cada uma dessas partes do programa é chamada de thread e cada thread possui um caminho de execução independente. Portanto, o multithreading é uma forma especial de multitarefa.
Você deve conhecer a multitarefa porque é realmente suportada por todos os sistemas operacionais modernos. No entanto, existem dois tipos distintos de multitarefa: baseada em processos e baseada em threads. É muito importante entender as diferenças entre os dois.
Para muitos leitores, a multitarefa baseada em processos é uma forma mais familiar. Um processo é essencialmente um programa de execução. Portanto, a multitarefa baseada em processos é caracterizada por permitir que seu computador execute dois ou mais programas simultaneamente. Por exemplo, a multitarefa baseada em processos permite executar o compilador Java simultaneamente enquanto estiver usando um editor de texto. Na multitarefa baseada em processos, um programa é a menor unidade de código atribuída pelo agendador.
Em um ambiente multitarefa baseado em roscas, os threads são a menor unidade de execução. Isso significa que um programa pode executar funções de duas ou mais tarefas simultaneamente. Por exemplo, um editor de texto pode formatar o texto durante a impressão. Portanto, os programas de vários processos lidam com "grandes imagens", enquanto os programas com vários threads lidam com detalhes.
Os programas multithread requerem menos despesas administrativas do que os programas de vários processos. Os processos são tarefas pesadas que exigem seu próprio espaço de endereço independente. A comunicação entre processos é cara e restrita. A transformação entre os processos também é muito cara. Os tópicos, por outro lado, são jogadores leves. Eles compartilham o mesmo espaço de endereço e compartilham o mesmo processo juntos. A comunicação entre thread é barata e a conversão entre thread também é de baixo custo. Quando um programa Java usa um ambiente de processamento de tarefas de vários processos, o programa de vários processos não é controlado por Java, enquanto a multi-threading é controlada por Java.
O multithreading ajuda a escrever programas eficientes com a utilização máxima da CPU, pois o tempo ocioso é mantido no mínimo. Isso é crucial para ambientes interativos de interface da rede em execução em Java, porque o tempo livre é público. Por exemplo, a taxa de transmissão de dados da rede é muito menor que a capacidade de processamento do computador, e a velocidade de leitura e escrita dos recursos do sistema de arquivos locais é muito menor que a da CPU. . Em um ambiente tradicional de thread único, seu programa deve esperar que cada uma dessas tarefas seja concluída antes de executar a próxima etapa-embora a CPU tenha muito tempo livre. O multithreading permite que você obtenha e aproveite ao máximo esse tempo livre.
Modelo de Threading Java
O sistema de tempo de execução do Java depende de threads de várias maneiras, e todos os designs da biblioteca de classes levam em consideração multithreading. De fato, o Java usa threads para tornar todo o ambiente assíncrono. Isso ajuda a reduzir a parte inválida, impedindo o desperdício de loops da CPU.
Para entender melhor as vantagens de um ambiente multithread, ele pode ser comparado com seus controles. O método de processamento de um sistema de thread único é usar um método de loop de eventos chamado Polling. Neste modelo, o controle de thread único é executado em um loop infinito, pesquisando uma sequência de eventos para determinar o que fazer a seguir. Depois que o dispositivo de votação retornar um sinal de que o arquivo de rede está pronto para ser lido, o controle de agendamento de loop de eventos gerencia o manipulador de eventos apropriado. Até que o manipulador de eventos retorne, nenhum outro evento ocorre no sistema. Isso desperdiça tempo da CPU. Isso faz parte do programa ocupar o sistema exclusivamente e impedir a execução de outros eventos. Em geral, em um ambiente de thread único, quando um thread bloqueia (bloqueia, suspende a execução) enquanto aguarda recursos, todo o programa para de funcionamento.
A vantagem do Java Multithreading é que ele cancela o mecanismo principal de loop/votação. Um tópico pode ser pausado sem afetar outras partes do programa. Por exemplo, o tempo ocioso gerado quando um thread lê dados da rede ou aguarda a entrada do usuário pode ser utilizada em outros lugares. O multithreading permite que um loop ao vivo durma por um segundo em cada lacuna de quadros sem parar todo o sistema. Há um bloqueio de thread em um programa Java, apenas um thread é suspenso e os outros threads continuam sendo executados.
Os tópicos existem em vários estados. O thread pode estar em execução. Pode ser executado enquanto você receber o tempo da CPU. O encadeamento em execução pode ser suspenso e interromper temporariamente sua execução. Um encadeamento suspenso pode ser retomado, permitindo que ele continue fugindo de onde parou.
A qualquer momento, o thread pode terminar, o que interrompe imediatamente sua operação. Depois de encerrado, o encadeamento não pode ser restaurado.
Prioridade do tópico
O Java prioriza cada encadeamento para determinar como tratar o thread quando comparado com outros threads. A prioridade do tópico é um número inteiro que detalha o relacionamento prioritário entre os threads. Como valor absoluto, a prioridade não tem sentido; Em vez disso, a prioridade do thread é usada para determinar quando alternar de um thread em execução para outro. Isso é chamado de "interruptor de contexto". As regras que determinam a ocorrência de conversão de contexto são simples:
Os threads podem desistir automaticamente do controle. No caso de E/S indecisa, o sono ou o bloqueio é feito por concessões explícitas. Sob essa suposição, todos os outros threads são detectados e o encadeamento de maior prioridade pronto para executar é concedido à CPU.
Os threads podem ser antecipados por threads de alta prioridade. Nesse caso, o encadeamento de baixa prioridade não desiste ativamente, o processador está ocupado primeiro - não importa o que esteja fazendo - o processador é ocupado pelo segmento de alta prioridade. Basicamente, uma vez que um encadeamento de alta prioridade está prestes a ser executado, ele é executado. Isso é chamado de multitarefa prioritária.
A situação é um pouco complicada quando dois fios da mesma prioridade competem pelos ciclos da CPU. Para sistemas operacionais como o Windows 98, threads com igual prioridade dividem automaticamente o tempo no modo Loop. Para outros sistemas operacionais, como o Solaris 2.x, os threads prioritários são automaticamente abandonados em relação aos seus pares. Se não for esse o caso, outros threads não serão executados.
Aviso: a conversão de contexto de encadeamentos de prioridade mais baixa em diferentes sistemas operacionais pode gerar erros.
Sincronização
Como o Multithreading introduz um comportamento assíncrono em seu programa, deve haver maneiras de melhorar a sincronização quando você precisar. Por exemplo, se você deseja que dois threads se comuniquem e compartilhem uma estrutura de dados complexa, como uma sequência de listas vinculadas, você precisa de uma maneira de garantir que eles não sejam conflitantes entre si. Ou seja, você deve impedir que um thread escreva dados enquanto outro thread está lendo dados da lista vinculada. Para esse fim, o Java implementa outro método baseado no antigo modelo de sincronização entre processos: monitor. O processo de gerenciamento é um mecanismo de controle definido pela primeira vez pelo Carhoare.
Você pode pensar no processo de gerenciamento como uma caixa pequena que controla apenas um thread. Depois que uma rosca entra em um tubo, todos os roscas devem esperar até que a rosca saia do tubo. Dessa forma, a gerência pode ser usada para impedir que os recursos compartilhados sejam manipulados por vários threads.
Muitos sistemas multithread consideram o processo de gerenciamento como um objeto que o programa deve se referir claramente e operar. O Java fornece uma solução clara. Não existe classe "monitor"; Depois que um encadeamento é incluído em um método de sincronização, nenhum outro encadeamento pode chamar o método de sincronização do mesmo objeto. Isso permite que você escreva um código multithread muito claro e conciso, pois o suporte à sincronização é integrado ao idioma.
Entrega de mensagens
Depois de dividir o programa em vários threads, você precisa definir a conexão entre cada thread. Ao planejar na maioria dos outros idiomas, você deve confiar no sistema operacional para estabelecer comunicação entre thread. Isso certamente aumentará o custo. No entanto, o Java fornece uma maneira limpa e de baixo custo de conversar entre multithreads - chamando métodos predefinidos que todos os objetos têm. O sistema de mensagens de Java permite que um thread insira um método síncrono de um objeto e, em seguida, espere lá até que outros threads o notifiquem explicitamente.
Classe de thread e interface executável
O sistema multi-threades da Java é baseado na classe Thread, seus métodos e sua interface de co-empresa executada. A classe Thread encapsula a execução de threads. Como você não pode se referir diretamente ao estado do thread em execução, você deve processá -lo por meio de seu proxy, para que a instância do encadeamento seja gerada. Para criar um novo thread, seu programa deve estender o thread ou implementar a interface executável.
A classe Thread define vários métodos para ajudar a gerenciar threads. Os métodos usados neste capítulo são mostrados na tabela: