Escolar Documentos
Profissional Documentos
Cultura Documentos
Threads e Concorrncia em
Java (Material de Apoio)
|
INE-CTC-UFSC
1
INE-CTC-UFSC
Programao concorrente
|
main()
Programao concorrente
g()
g()
g()
INE-CTC-UFSC
Threads em Java
Threads em Java
|
http://java.sun.com
INE-CTC-UFSC
INE-CTC-UFSC
INE-CTC-UFSC
INE-CTC-UFSC
10
INE-CTC-UFSC
new thread
runnable
non runnable
Pronta
Em execuo
running
Esperando
dead
INE-CTC-UFSC
11
Adormecida
Morta
INE-CTC-UFSC
Bloqueada
12
Prioridade de thread
|
Prioridade de thread
INE-CTC-UFSC
13
Prioridade de thread
Grupo de Threads
class Lanador {
public static void main(String args[]) {
AltaPrioridade a = new AltaPrioridade();
BaixaPrioridade b = new BaixaPrioridade();
System.out.println("Iniciando threads...");
b.start();
a.start();
// deixa as outras threads iniciar a execuo.
Thread.currentThread().yield();
System out println("Main feito");
System.out.println("Main
}
}
Iniciando threads...
Main feito
Thread de alta prioridade executando -> 10
Thread de alta prioridade executando -> 10
Thread de baixa prioridade executando -> 1
Thread de baixa prioridade executando -> 1
Thread de baixa prioridade executando -> 1
Thread de alta prioridade executando -> 10
Thread de alta prioridade executando -> 10
Thread de baixa prioridade executando -> 1
:
INE-CTC-UFSC
stop()
suspend()
resume()
stop()
suspend()
resume()
ThreadGroup A
Thread A1
Thread A2
:
Thread An
ThreadGroup B
Thread B1
Thread B2
:
Thread Bn
INE-CTC-UFSC
Grupo de Threads
16
Sincronizao de Threads
|
14
INE-CTC-UFSC
17
class MeuDado {
private int Dado;
public void armazenar(int Dado) {
this.Dado=Dado;
;
}
public int carregar() {
return this.Dado;
}
}
class Main {
public static void main(String argv[]) {
MeuDado dado = new MeuDado();
new Thread(new Produtor(dado)).start();
new Thread(new Consumidor(dado)).start();
}
}
INE-CTC-UFSC
18
INE-CTC-UFSC
19
INE-CTC-UFSC
21
INE-CTC-UFSC
22
20
public MeuDado() {
Pronto=false;
Ocupado=true;
}
public
pub
c sy
synchronized
c o
ed void
o d a
armazenar(int
a e a ( t Dado)
ado) {
while(!Ocupado);
this.Dado=Dado;
Ocupado=false;
Pronto=true;
}
public synchronized int carregar() {
while(!Pronto);
Pronto=false;
Ocupado=true;
return this.Dado;
}
}
23
INE-CTC-UFSC
24
Cdigo corrigido
Ocupado=true;
return this.Dado;
class MeuDado {
private int Dado;
private boolean Pronto;
private boolean Ocupado;
}
}
public MeuDado() {
Pronto=false;
}
Comentrio:
Tem que fornecer um objeto
para o synchronized;
No adequado usar loop
busy-wait (ver while), pois
usa o processador.
INE-CTC-UFSC
25
INE-CTC-UFSC
Barreira de sincronizao
|
|
|
while (!Pronto)
try {
wait();
} catch
(InterruptedException e) { }
Pronto=false;
notify();
return this.Dado;
}
}
class MeuDado {
private int Dado;
private boolean Pronto;
public MeuDado() {
Pronto=false;
Ocupado=true;
}
public void armazenar(int Dado) {
while(!Ocupado);
synchronized(this) {
this.Dado=Dado;
Ocupado=false;
Pronto=true;
}
}
public int carregar() {
while(!Pronto);
synchronized(this) {
Pronto=false;
Faz uso dos mtodos wait() e notify() para gerar eventos de espera e
notificao para parar de esperar.
26
Barreira de sincronizao
import java.util.*;
class Barreira {
private int ThreadsParticipante;
private int EsperandoNaBarreira;
public Barreira(int num) {
ThreadsParticipante = num;
EsperandoNaBarreira = 0;
}
public synchronized void Alcanado() {
EsperandoNaBarreira++;
if(ThreadsParticipante != EsperandoNaBarreira) {
try {
wait();
catch (InterruptedException e) {}
} else {
notifyAll();
EsperandoNaBarreira=0;
}
}
}
INE-CTC-UFSC
27
INE-CTC-UFSC
28
INE-CTC-UFSC
29