[Curso Java Basico - Orientacao a Objetos] Aula 26: Classes e metodos com ret...
[Curso Java Basico] Aula 72: Threads: notify, wait e notifyAll
1. 72 Curso de Java
Threads:
notify, wait e
notifyAll
2.
3. • Uma thread A está sendo executada dentro de um
método sincronizado e precisa de acesso a um
recurso R que no momento está indisponível
4. • Uma thread A está sendo executada dentro de um
método sincronizado e precisa de acesso a um
recurso R que no momento está indisponível
• Se a thread A ficar esperando por R, irá bloquear o
objeto impedindo que outras threads acessem o
mesmo
5. • Uma thread A está sendo executada dentro de um
método sincronizado e precisa de acesso a um
recurso R que no momento está indisponível
• Se a thread A ficar esperando por R, irá bloquear o
objeto impedindo que outras threads acessem o
mesmo
• Nesse caso a melhor solução para não causar
problemas é liberar temporariamente o controle do
objeto permitindo que outra thread seja executada
6. • wait: bloqueia a execução da thread
temporariamente, ou seja, coloca a thread em modo
de espera
7. • wait: bloqueia a execução da thread
temporariamente, ou seja, coloca a thread em modo
de espera
• a thread fica em modo de espera até que seja
notificada
8. • wait: bloqueia a execução da thread
temporariamente, ou seja, coloca a thread em modo
de espera
• a thread fica em modo de espera até que seja
notificada
• notify: notifica uma thread the estava esperando, ou
seja, retorna a execução da thread
9. • wait: bloqueia a execução da thread
temporariamente, ou seja, coloca a thread em modo
de espera
• a thread fica em modo de espera até que seja
notificada
• notify: notifica uma thread the estava esperando, ou
seja, retorna a execução da thread
• notifyAll: notice todas as threads, e a que tem
prioridade mais alta ganha acesso ao objeto
10. public class TiqueTaque {
boolean tique;
synchronized void tique(boolean estaExecutando){
if (!estaExecutando){
tique = true;
notify(); //notifica qualquer thread the estiver esperando
return;
}
System.out.print("Tique ");
tique = true;
notify();
try {
while (tique){
wait(); //espera toque terminar a execução
}
} catch(InterruptedException e){
System.out.println("Thread foi interrompida");
}
}
}
11. synchronized void taque(boolean estaExecutando){
if (!estaExecutando){
tique = false;
notify(); //notifica qualquer thread the estiver esperando
return;
}
System.out.println("Taque");
tique = false;
notify();
try {
while (!tique){
wait(); //espera tique terminar a execução
}
} catch(InterruptedException e){
System.out.println("Thread foi interrompida");
}
}
12. public class ThreadTiqueTaque implements Runnable {
Thread thread;
TiqueTaque tt;
final int QTD = 5;
public ThreadTiqueTaque(String nome, TiqueTaque tt) {
thread = new Thread(this, nome);
this.tt = tt;
thread.start();
}
@Override
public void run(){
if (thread.getName().equalsIgnoreCase("Tique")){
for (int i=0; i<QTD; i++){
tt.tique(true);
}
tt.tique(false);
} else {
for (int i=0; i<QTD; i++){
tt.taque(true);
}
tt.taque(false);
}
}
}
13. public static void main(String[] args) {
TiqueTaque tt = new TiqueTaque();
ThreadTiqueTaque tique = new ThreadTiqueTaque("Tique", tt);
ThreadTiqueTaque taque = new ThreadTiqueTaque("Taque", tt);
try {
tique.thread.join();
taque.thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
14. • Experimente remover os códigos de wait e notify
• Irá notar que os métodos param de trabalhar em
conjunto