72 Curso de Java
Threads:
notify, wait e
notifyAll
• 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
• 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
• 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
• wait: bloqueia a execução da thread
temporariamente, ou seja, coloca a thread em modo
de espera
• 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
• 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
• 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
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");
}
}
}
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");
}
}
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);
}
}
}
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();
}
}
• Experimente remover os códigos de wait e notify
• Irá notar que os métodos param de trabalhar em
conjunto
https://github.com/loiane/curso-java-basico
Código Fonte:
Não conhece Git/Github?
http://www.loiane.com/2013/11/
screencast-git-e-github-para-iniciantes
http://loiane.training
Fórum para dúvidas + certificado do curso.
Cadastro em:
Obrigada!
http://loiane.com
facebook.com/loianegroner
twitter.com/loiane
https://github.com/loiane
youtube.com/loianegroner
http://loiane.training

[Curso Java Basico] Aula 72: Threads: notify, wait e notifyAll

  • 1.
    72 Curso deJava Threads: notify, wait e notifyAll
  • 3.
    • Uma threadA 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 threadA 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 threadA 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: bloqueiaa execução da thread temporariamente, ou seja, coloca a thread em modo de espera
  • 7.
    • wait: bloqueiaa 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: bloqueiaa 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: bloqueiaa 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(booleanestaExecutando){ 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 ThreadTiqueTaqueimplements 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 voidmain(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 removeros códigos de wait e notify • Irá notar que os métodos param de trabalhar em conjunto
  • 15.
  • 16.
  • 17.
    http://loiane.training Fórum para dúvidas+ certificado do curso. Cadastro em:
  • 18.
  • 19.