O que é Wait and Notify em Java?



Esperar e notificar em Java são os dois métodos finais que permitem que os threads se comuniquem uns com os outros. Este artigo irá ajudá-lo com os detalhes

recurso em Java permite a execução simultânea de duas ou mais partes de um programa. Cada parte é um Thread. Esses fios geralmente precisam coordenar suas ações. Isso é feito usando alguns métodos finais, como Wait and Notify em Java. Este artigo ajudará você a entender esses métodos em detalhes.

Discutirei os tópicos na seguinte ordem:





Vamos começar!

O que é sincronização de thread?

Programas multi-threaded podem regularmente apresentar uma situação em que vários tentativa de obter o mesmo recurso que produz resultados fraudulentos e surpreendentes. Às vezes, mais de um thread pode tentar acessar um recurso compartilhado, você precisa garantir que o recurso será usado por apenas um thread de cada vez. Isso pode ser feito usando Sincronização em Java.



Agora falando sobre Polling. A votação é um processo de testar uma condição repetidamente até que seja verdadeira. Este método é implementado com a ajuda de para verificar se uma determinada condição é verdadeira ou não. Você pode usar este método para threads, mas ele desperdiça muitos ciclos de CPU e também torna o processo de implementação muito ineficiente. Para evitar esses tipos de bugs, métodos como Wait e Notify em Java são introduzidos.

O que são métodos Wait () e Notify ()?

Para resolver o problema de multithreading, métodos como Wait e Notify em são usados. A classe Object usa esses três métodos finais que permitem que os threads se comuniquem sobre o status bloqueado de um recurso. Eles também são chamados de Blocos Protegidos.

tipo de dados data t sql

Esperar()

Este método faz com que a thread espere até que outra thread invoque os métodos notificar () e notificarAll () para este objeto. Este método Wait () diz ao encadeamento de chamada para liberar um bloqueio e ir dormir até que outro encadeamento entre no mesmo monitor e chame notificar (). Este método libera o bloqueio antes de esperar e readquire o bloqueio antes de retornar do método wait ().



O método Wait () está totalmente integrado ao bloqueio de sincronização. Isso é feito usando um recurso não disponível diretamente no mecanismo de sincronização.

Sintaxe:

synchronized (lockObject) {while (! condition) {lockObject.wait ()} // execute a ação aqui}

O segmento atual deve possuir o monitor do objeto. Ele deve ser chamado apenas a partir do método synchronized ou então lançará uma exceção.

Notificar ()

Este método é usado para notificar o que precisa para funcionar. Ele desperta um tópico que chamou de esperar() método no mesmo objeto.

Observe que ligar notificar () eventualmente não desiste de um bloqueio. Diz a um thread em espera que pode despertar. No entanto, o bloqueio não é realmente desistido até que o bloco sincronizado do notificador seja concluído. Agora diga, se você ligar notificar () em um recurso, mas o notificador ainda precisa realizar ações por 10 segundos dentro de seu bloco sincronizado, o encadeamento que estava esperando terá que esperar pelo menos mais 10 segundos adicionais para que o notificador libere o bloqueio no objeto, mesmo notificando () foi chamado.

Sintaxe:

synchronized (lockObject) {// activate_the_condition lockObject.notify () // qualquer código adicional se necessário}

NotifyAll ()

Este método é usado para despertar todos os threads que chamaram wait () no mesmo objeto. O encadeamento de maior prioridade será executado primeiro na maioria das situações, embora não seja garantido. Outras coisas são iguais ao método notificar ().

Por que e como usar Wait () e Notify () em Java?

Você deve usar Esperar e Notificar em porque eles estão relacionados ao bloqueio e o objeto tem um bloqueio. Mesmo que esperar e notificar em Java sejam um conceito bastante fundamental, eles são definidos no classe de objeto . Surpreendentemente, não é tão fácil escrever o código usando esperar e notificar. Você pode testar isso escrevendo código para resolver o problema produtor-consumidor usando esperar e notificar. Exemplo de consumidor produtor - esperar e notificar em Java-EdurekaAqui, eu tenho um Fila edois tópicoschamado Produtor e Consumidor . Produtor thread coloca o número em uma fila compartilhada e Consumidor thread consome os números do balde compartilhado.

A condição é que, depois que um item é produzido, o encadeamento do consumidor deve ser notificado e, da mesma forma, depois que o encadeamento do produtor de consumo precisa ser notificado. Este inter-threadcomunicaçãoé obtido usando esperar e notificar em Java.

Nota : W.ait e nãométodos tify são definidos na classe de objeto, e devem ser chamados dentro do bloco sincronizado.

Exemplo

public class Thread1 {public static void main (String [] args) {Thread2 b = new Thread2 () b.start () synchronized (b) {try {System.out.println ('Waiting for 2 to complete ...' ) b.wait ()} catch (InterruptedException e) {e.printStackTrace ()} System.out.println ('Total is:' + b.total)}}} class Thread2 extends Thread1 {int total @Override public void run () {synchronized (this) {for (int i = 0 i<=100 i++) { total += i } notify() }}}

Observe que no exemplo acima, um objeto de Thread2, isto é, b, está sincronizado. Este b completa o cálculo antes que o thread principal produza seu valor total.

Resultado:

Isso nos leva ao final deste artigo, onde aprendemos o no Wait and Notify em Java.Espero que o conteúdo mencionado acima tenha sido útil para melhorar o seu conhecimento. Continue lendo, continue explorando!

Verifique também pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. O curso de certificação e treinamento Java J2EE e SOA da Edureka é projetado para estudantes e profissionais que desejam ser um desenvolvedor Java. O curso foi desenvolvido para lhe dar uma vantagem inicial na programação Java e treiná-lo para os conceitos básicos e avançados de Java, juntamente com vários como Hibernate e Spring.