English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
método wait da classe java Object
Quando a thread B tenta acessar um recurso compartilhado, deseja obter o objeto de lock do recurso, mas descobre que o lock já foi obtido pela thread A. Neste momento, a thread B só pode ser suspensa, esperando que a thread A libere o lock.
Mas a thread A que já obteve o lock, durante a execução, por não satisfazer algumas condições, temporariamente não deseja continuar a execução, preferindo esperar primeiro (atenção: é a thread A que já possui o lock que quer ativamente esperar), esperando que uma condição específica seja satisfeita para continuar a tarefa. Dentro do bloco de código sincronizado, a thread A deve primeiro liberar o lock, permitindo que a thread B tenha direito de obter o lock, entrar no bloco de código sincronizado e executar o código. Após a conclusão da thread B, se as condições necessárias para a thread A já foram satisfeitas, então neste momento deve haver um mecanismo de notificação para que a thread A passe do estado de espera para o estado de execução, continuando a execução do código.
Alguns alunos acreditam que a thread A também pode continuar a verificar em loop se a condição já foi satisfeita, sem necessariamente interromper a si mesma e esperar. Isso também é uma abordagem, mas o que? Consume muito CPU e também não sabe quando a condição será satisfeita.
Para que as threads possam se comunicar e协调,é necessário ter um mecanismo de espera e um mecanismo de notificação, no JAVA, correspondem aos métodos wait e notify.
Método wait do Object
synchronized (obj) { enquanto (a condição não for ok){ obj.wait(); } }
Se quiser que a thread A esteja em estado de espera, pode chamar o método wait do objeto atual. Assim que o método wait for ser chamado, também significa: a thread A já obteve o bloqueio e já fez tudo o que podia fazer, agora só pode esperar, esperando que outras operações de sincronização executem algum código antes de voltar a trabalhar.
Atenção:
O método wait é definido na classe raiz Object, Thread herda da classe Object, naturalmente também tem o método wait. Mas aqui não é chamada o método wait do objeto da thread atual, mas o método wait do objeto atual com atributo de bloqueio; isso também não estou muito entendendo, acho que para fazer a thread A passar para o estado de espera e ser acordada, mesmo que use o método wait e notify da thread A, também pode ser feito, mas acho que a implementação é muito difícil. Além disso, do ponto de vista da cena, wait definido na Object também é razoável, representando que a thread está na piscina de espera do objeto.
Agradecemos a leitura, esperamos ajudar a todos, obrigado pelo apoio ao site!