Ciclo de vida do thread em Java

Publicados: 2023-01-27

Índice

Noções básicas de threads Java:

Uma thread em Java facilita a realização de múltiplas atividades dentro de um único processo. É considerado um processo leve. Um thread também pode ser definido como uma sequência de instruções executadas. Cada thread em Java tem sua própria pilha, contador de programa e variáveis ​​locais. Os encadeamentos Java também podem ser uma série aninhada de chamadas de método. A memória, o estado por processo e os arquivos são compartilhados por threads.

Usos de threads em Java:

    • Para executar processamento em segundo plano ou assíncrono
    • Para aumentar a sensibilidade dos aplicativos GUI
    • Para implementar os lados positivos dos sistemas multiprocessadores
    • Para agilizar a lógica de programação no caso da existência de múltiplos

Existem dois caminhos de execução quando um thread é chamado. Um dos dois caminhos é usado para a execução do encadeamento e o outro seguirá a instrução que sucede a invocação do encadeamento. Cada thread em Java tem um espaço de memória e uma pilha separados.

Os fatores de risco encontrados durante o uso de encadeamentos em códigos Java são os seguintes.

  • A coordenação adequada entre os encadeamentos é necessária nos casos em que os encadeamentos acessam variáveis ​​comuns para exibir dados de forma consistente.
  • A performance e manutenção de threads, se superutilizadas nos programas, torna-se difícil.

Ciclo de vida de threads em Java:

Em qualquer instante da execução do programa, as threads em Java existem em qualquer um dos estados mencionados abaixo.

  1. Novo
  2. Bloqueado
  3. Executável
  4. Espera cronometrada
  5. Espera
  6. Rescindido

Uma visão detalhada do ciclo de vida do thread em Java

Novo tópico:

O thread recém-criado está no estado 'Novo'. Não é progredido para executar neste estado. A execução do código de uma thread no novo estado ainda não ocorreu. Ainda está para correr.

Estado executável:

Os encadeamentos no estado executável estão prontos para serem executados. Um thread neste estado pode estar pronto para ser executado a qualquer momento ou pode já estar em execução. O agendador de encadeamento aprimora a responsabilidade de alocar tempo para a execução do encadeamento. Cada thread individual recebe um tempo específico em um programa multithread. Cada encadeamento individual é executado por uma pequena duração e, em seguida, encontra uma pausa. A CPU é então entregue a outro thread para fornecer uma chance para os outros threads serem executados. Neste ponto, todos os encadeamentos prontos para execução que estão aguardando a CPU e os encadeamentos que estão em execução atualmente encontram-se em um estado executável.

Confira nossos cursos de tecnologia gratuitos para obter uma vantagem sobre a concorrência.

Explore nossos cursos populares de engenharia de software

Mestre em Ciência da Computação pela LJMU & IIITB Programa de Certificação de Cibersegurança Caltech CTME
Bootcamp de Desenvolvimento Full Stack Programa PG em Blockchain
Programa Executivo PG em Desenvolvimento Full Stack
Veja todos os nossos cursos abaixo
Cursos de Engenharia de Software

Aguardando/estado bloqueado:

Um thread está em qualquer um dos estados mencionados abaixo quando não está operando temporariamente.

  • Espera
  • Bloqueado

Um thread aguardando a conclusão da E/S está em um estado bloqueado. A função do agendador de threads é agendar a execução de um thread bloqueado ou em espera, reativando-o. Qualquer encadeamento neste estado não é permitido para a continuação da execução até que seja transformado em um estado executável. Os threads no estado de bloqueio ou espera não usam nenhum ciclo de CPU.

Um thread é forçado a ser bloqueado quando tenta acessar a seção protegida de um código que está protegido por algum outro thread no momento. O escalonador transforma uma das threads esperando por uma seção protegida em um estado executável quando a seção é desbloqueada para todas as threads. Por outro lado, um thread existe em um estado de espera enquanto espera pelo outro thread em uma condição específica. Os encadeamentos no estado de espera são empurrados para um estado executável quando a condição especificada para espera é satisfeita. Se um thread em execução no momento for movido para um estado de espera/bloqueado, o agendador de threads agendará outro thread da sequência executável para execução.

Tempo de espera:

Quando um método é invocado com um argumento de tempo limite, o thread existe em um estado de espera cronometrado. Um thread continua nesse estado até a conclusão do tempo limite especificado ou até o recebimento de uma notificação. Por exemplo, um thread é deslocado para um estado de espera cronometrado se invocar espera condicional ou suspensão.

Estado encerrado:

A finalização de encadeamentos ocorre devido a qualquer um dos seguintes motivos.

  • A saída normal do encadeamento após a conclusão da execução dos segmentos de código no encadeamento.
  • Ocorrência de qualquer evento errôneo raro, como uma exceção não tratada e falha de segmentação.

Um thread em um estado encerrado não consome nenhum ciclo de CPU.

Aprenda Cursos de Desenvolvimento de Software online nas melhores universidades do mundo. Ganhe Programas Executivos de PG, Programas de Certificado Avançado ou Programas de Mestrado para acelerar sua carreira.

Habilidades de desenvolvimento de software sob demanda

Cursos de JavaScript Cursos Básicos de Java Cursos de estruturas de dados
Cursos de Node.js Cursos de SQL Cursos de desenvolvimento full stack
Cursos NFT Cursos DevOps Cursos de Big Data
Cursos React.js Cursos de segurança cibernética Cursos de computação em nuvem
Cursos de Design de Banco de Dados Cursos de Python Cursos de Criptomoedas

Implementação de estados de thread em Java:

Para realizar o estado atual de uma thread em Java, utilizamos o método Thread.getState(). Java também oferece a classe java.lang.Thread.State na qual as constantes ENUM para o estado de um thread são definidas. Os detalhes estão resumidos na tabela abaixo.

Tipo constante Declaração Descrição
Novo public static final Thread.State NOVO É o estado da thread que acabou de ser criada e ainda não iniciou sua execução.
Executável public static final Thread.State RUNNABLE Ele descreve o estado de um encadeamento que já está em execução ou um encadeamento que está pronto para ser executado.

O mesmo encadeamento pode estar em um estado executável para a máquina virtual Java e em estado de espera para outros recursos do sistema operacional, como um processador.

Bloqueado public static final Thread.State BLOQUEADO Descreve o estado de um thread que está bloqueado aguardando o bloqueio do monitor. Ele permanece no mesmo estado até que o bloco do monitor entre em um método/bloco sincronizado ou entre novamente no método sincronizado após invocar o Object.wait().
Espera public static final Thread.State WAITING Ele descreve o estado de um thread que está esperando devido à chamada de um dos seguintes métodos.

  1. Object.wait sem tempo limite
  2. LockSupport.park
  3. Thread.join sem tempo limite

O estado de espera pode ser devido à conclusão de uma tarefa específica por outro thread.

Espera cronometrada public static final Thread.State TIMED_WAITING É um estado do thread que espera por um tempo especificado. A invocação de qualquer um dos métodos a seguir resulta em um estado de espera cronometrado de um thread com um tempo de espera positivo atribuído.

  1. Thread.join com tempo limite
  2. Object.wait com tempo limite
  3. LockSupport.partUntil
  4. LockSupport.parkNanos
Rescindido public static final Thread.State TERMINATED É o estado de um thread que concluiu a execução de suas declarações de código constituintes.

O thread permanece em um estado NOVO quando acaba de ser criado. Quando o método .start() é invocado em um thread, ele é movido para um estado Runnable pelo agendador de thread. Quando o método join() é invocado em uma instância de thread, o thread que está executando a instrução de código no momento aguardará que esse thread seja encerrado. Portanto, antes da impressão da instrução final no console, a função join() é invocada no thread 2 pelo programa e mantém o thread1 em espera até que o thread2 conclua sua execução e se mova para o estado encerrado. Como o thread1 está aguardando a conclusão da execução do thread2, ele é colocado no estado WAITING.

Leia nossos artigos populares relacionados ao desenvolvimento de software

Como implementar a abstração de dados em Java? O que é classe interna em Java? Identificadores Java: Definição, Sintaxe e Exemplos
Entendendo o encapsulamento em OOPS com exemplos Argumentos de linha de comando em C explicados Os 10 principais recursos e características da computação em nuvem em 2022
Polimorfismo em Java: Conceitos, Tipos, Características e Exemplos Pacotes em Java e como usá-los? Tutorial do Git para iniciantes: aprenda o Git do zero

Méritos e limitações do uso de threads em programas Java:

O uso de threads em programas Java tem os seguintes benefícios.

  • Redução no tempo gasto para desenvolver o código
  • Custos de manutenção reduzidos
  • Desempenho aprimorado de aplicativos complexos
  • Aumentando a capacidade de resposta das interfaces do usuário
  • Paralelizando as tarefas
  • Os encadeamentos são usados ​​em aplicativos de servidor para melhorar o alto rendimento e a utilização de recursos.
  • Se todos os recursos de computação da CPU não puderem ser usados ​​por um thread, a execução de outro thread os manterá engajados.
  • Se o mesmo conjunto de dados for operado por vários threads, seu cache poderá ser compartilhado. Isso leva a um melhor aproveitamento do cache ou harmonização de seus valores.

Existem várias desvantagens de usar threads em programas Java. Alguns deles estão listados abaixo.

  • Ao compartilhar caches, buffers de tradução (TLBs) ou quaisquer outros recursos de hardware, vários threads podem interferir uns nos outros.
  • Mesmo quando apenas um único thread está operando, o tempo de execução de um thread não pode ser aprimorado. No entanto, a degradação do tempo de execução é permitida. Isso pode ser devido aos estágios de pipeline adicionais e/ou às frequências mais lentas necessárias para a acomodação do hardware de comutação de threads.
  • Numerosas mudanças são necessárias em ambos os sistemas operacionais e programas aplicativos em comparação com o multiprocessamento porque o suporte de hardware é mais exposto ao software em multithreading.

Se você estiver interessado em aprender mais sobre Java, desenvolvimento de software full-stack, confira o Programa Executivo PG em Desenvolvimento de Software da upGrad & IIIT-B - Especialização em Desenvolvimento Full Stack, projetado para profissionais que trabalham e oferece mais de 500 horas de treinamento rigoroso , 9+ projetos e atribuições, status IIIT-B Alumni, projetos práticos práticos e assistência de trabalho com as principais empresas.

Quer compartilhar este artigo?

Prepare-se para uma Carreira do Futuro

Inscreva-se agora para Mestrado em Engenharia de Software