Suspensão e espera são dois métodos usados para multithreading em Java. O método sleep pertence à classe Thread enquanto o método wait é da classe Object. o diferença chave entre dormir e esperar em Java é que, o sleep é usado para suspender a execução do encadeamento atual pelo número especificado de milissegundos enquanto o método wait é usado para fazer com que o encadeamento atual aguarde até que outro encadeamento invoque o método notify ou notifyAll do objeto.
Um encadeamento é a menor unidade de processamento no sistema operacional. É um único fluxo seqüencial de controle dentro de um programa. Threads são leves. Multithreading é o mecanismo de execução de vários threads ao mesmo tempo. Linguagens de programação como Java suportam multithreading. O multithreading tem vantagens porque permite executar vários threads simultaneamente e os threads são independentes um do outro. Existem métodos em Java que podem ser usados para multithreading. Dois deles dormem e esperam.
1. Visão geral e principais diferenças
2. O que é sono em Java
3. O que é espera em Java
4. Semelhanças entre dormir e esperar em Java
5. Comparação lado a lado - suspensão versus espera em Java em forma de tabela
6. Resumo
Existem vários processos em execução em um sistema operacional. Um processo é um programa em execução. Cada processo pode ter vários threads e há uma alternância de contexto entre esses threads. Em Java, existem duas maneiras de criar um encadeamento. Ou seja, estendendo a classe do encadeamento ou implementando a interface Runnable. A classe Thread possui construtores e métodos para criar e executar operações em um thread. A classe Thread estende a classe Object e implementa a interface Runnable. A interface Runnable deve ser implementada por qualquer classe cujas instâncias sejam executadas por um encadeamento. Quando o thread é executado, o código que deve ser executado é gravado dentro do método run. O encadeamento que deve ser executado é selecionado pelo agendador de encadeamentos. Somente um encadeamento é executado em um único processo.
Um thread passa por várias fases. Após criar um objeto da classe Thread, o programador pode chamar o método start. Antes de invocar esse método, diz-se que o encadeamento está no novo estado. O planejador de encadeamentos seleciona um encadeamento para executar. Se o encadeamento ainda não foi selecionado pelo agendador de encadeamentos, mas se o método inicial for chamado, o encadeamento estará em um estado executável. Depois que o agendador de encadeamentos seleciona o encadeamento a ser executado, ele transita para o estado de execução. Se o encadeamento estiver ativo, mas atualmente não estiver qualificado para execução, ele estará no estado não executável ou bloqueado. Após a conclusão do método de execução, o encadeamento passa para o estado finalizado. Essas são as principais fases do ciclo de vida da rosca.
Existem vários métodos disponíveis na classe de encadeamento para executar tarefas diferentes. O método sleep é usado para dormir o método por um período específico de tempo. A sintaxe para o método de suspensão é a suspensão de vazio público (milissegundos longos) lança InterruptedException. Isso faz com que o encadeamento atualmente em execução pare a execução temporariamente por um número especificado de milissegundos. Se outro encadeamento interromper o encadeamento atual, o status interrompido do encadeamento atual será limpo quando esta exceção for lançada..
Figura 01: Programa Java com método sleep
De acordo com o programa acima, o método run contém código que deve ser executado. No programa principal, dois objetos do ExampleThread1 são criados e os métodos de inicialização são invocados neles. Isso permitirá executar o código dentro do método run. Somente um thread é executado por vez. Com o segmento. dormir (1000); permitirá que o primeiro encadeamento encerre a execução por 1000 milissegundos. Quando um encadeamento está inativo, o agendador de encadeamentos seleciona o outro encadeamento.
Vários encadeamentos podem acessar um recurso compartilhado. Isso pode gerar uma saída incorreta. A sincronização de encadeamentos pode ser usada para criar apenas um encadeamento para acessar o recurso compartilhado. Assuma uma situação da seguinte maneira. Se houver dois segmentos como t1 e t2, t1 começará a salvar valores em um arquivo de texto chamado Text1.txt. Esses valores serão usados para algum outro cálculo quando t1 retornar. Se t2 iniciar antes de t1 retornar, t2 poderá alterar os valores salvos por t1. Isso pode fazer com que T1 forneça uma saída incorreta. Com a ajuda da sincronização, quando t1 começa a usar o arquivo Text1.txt, esse arquivo pode ser bloqueado, tornando-o acessível apenas por t1. O t2 não pode alterá-lo até que t1 libere o bloqueio para acessar esse arquivo de texto. Quando a tarefa é concluída, o T1 pode liberar o bloqueio. O bloqueio também é conhecido como monitor.
A sincronização do encadeamento pode ser alcançada pela comunicação entre encadeamentos. Uma seção crítica é um segmento de código que acessa os recursos compartilhados. Na comunicação entre encadeamentos, um encadeamento é pausado, sendo executado em sua seção crítica, e outro encadeamento pode entrar na mesma seção crítica a ser executada. É implementado usando os métodos wait, notify e notifyAll. Eles pertencem à classe Object. O método wait é usado para permitir que o thread atual libere o bloqueio e aguarde até que outro thread invoque o método notify ou notifyAll do objeto. O método de notificação é usado para ativar um único encadeamento que está aguardando o bloqueio. O notifyAll ativa todos os threads que estão aguardando no bloqueio.
Figura 02: Classe da calculadora
Figura 03: Método principal
A classe Calculadora estende o Thread. O bloco sincronizado está dentro do método run. O método for loop e notify está dentro do bloco sincronizado. Dentro do método principal, uma instância de um thread criada e o método start são chamados nessa instância. O método principal aguardará até que o thread dê uma notificação. Ao executar o programa, o método principal aguarda toda a execução do método run e aguarda o método de notificação. Depois que o método de notificação é chamado, o método principal para de esperar e começa a executar o restante do código. Principal está aguardando até que o segmento da Calculadora seja concluído. Finalmente, o resultado da soma é impresso.
Se não houver bloco sincronizado e se o método principal tiver um código como abaixo, ele fornecerá a saída como zero porque não está aguardando a conclusão do outro encadeamento.
Calculadora t1 = nova Calculadora ();
t1. start ();
System.out.println (t1.sum);
sono vs espera em Java | |
O método sleep faz com que o encadeamento atual suspenda a execução pelo número especificado de milissegundos, sujeito à precisão e exatidão dos cronômetros e planejadores do sistema. | O método wait faz com que o thread atual aguarde até que outro thread invoque o método notify ou notifyAll do objeto. |
Associação com Bloqueio | |
O método de suspensão não libera o bloqueio em um objeto durante a sincronização. | O método wait libera o bloqueio durante a sincronização. |
Método de Execução | |
O método sleep é executado no encadeamento atual. | O método wait é chamado no objeto. |
Classe Associada | |
O sono é um método da classe Thread. | A espera é um método da classe Object. |
Conclusão | |
O processo de suspensão é concluído após o término do período especificado. | O método wait é interrompido chamando os métodos notify ou notifyAll. |
Existem vários processos em execução no sistema operacional. Cada processo pode ter vários threads. Um encadeamento é a menor unidade de processamento em um sistema operacional. A linguagem de programação Java suporta multithreading. Ele permite executar vários threads simultaneamente. A suspensão e a espera são dois métodos que podem ser usados ao implementar a multiencadeamento. A diferença entre suspensão e espera em Java é que, a suspensão é usada para suspender a execução do encadeamento atual pelo número especificado de milissegundos enquanto o método wait é usado para fazer com que o encadeamento atual aguarde até que outro encadeamento invoque o notify ou notifyAll método para o objeto.
1. “Comunicação entre segmentos em Java - Javatpoint.”. JavaTPoint. Disponivel aqui
2. Inter Thread Comunicação em multithreading Java | Tutorial Java principal | Studytonight. Disponivel aqui