aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads •...
Transcript of aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads •...
Threads
Auladehoje• EstudaremosaexecuçãoemparalelodeprogramasemJavapormeiodeThreads
Leonardo Murta Threads 2
PorqueusarThreads?• Threadspermitemprocessamentoparalelo– Podemosrodarmaisdeumatarefaaomesmotempo
– Podemostirarproveitodosváriosprocessadoresdonossocomputadorpararodarmaisrápidoumatarefa
Leonardo Murta Threads 3
Processosvs.ThreadsProcessos• Ambienteautocontido• Espaçoprópriodememória• Cadaaplicaçãoquerodano
sistemaoperacionaléumprocessoemseparado
• AJVMrodaseuprogramaJavaemumúnicoprocesso
Threads• Sãoprocessosleves• Compartilhamrecursos• Umprocessoécomposto
porumaoumaisthreads• OseuprogramaJavainicia
emumathreadprincipalmaspodeabrirthreadsadicionais
Leonardo Murta Threads 4
ExecuçãodeThreads
Leonardo Murta Threads 5
Thread 1 Thread 2
Computador single core(compartilhamento de tempo)
Computador dual core(paralelismo real)CPU1
CPU2
CPU1
ThreadsemJava• InterfaceRunnable
– Permitecriarclassesquepodemserexecutadasemthreadsseparadas
– Contemumúnicométodo,quedeveserimplementadocomocódigodatarefa:run()
• ClasseThread– Controlaacriaçãoeexecuçãodethreads– RecebeumobjetoRunnable comoparâmetro– Contémométodostart(),quechamaométodorun()doobjetoRunnable emumathreademseparado
Leonardo Murta Threads 6
Exemplopublic class Tarefa implements Runnable {
private final String nome;
public Tarefa(String nome) {this.nome = nome;
}
@Overridepublic void run() {for (int i = 0; i <= 100; i = i + 20) {System.out.println("Tarefa " + nome + ": " + i + "%");
}}
}
Leonardo Murta Threads 7
Exemplo• Criaçãodasthreads
Thread t1 = new Thread(new Tarefa("A"));Thread t2 = new Thread(new Tarefa("B"));
t1.start();t2.start();
Leonardo Murta Threads 8
ExemploResultadodaprimeiraexecuçãoTarefa A: 0%Tarefa A: 20%Tarefa B: 0%Tarefa A: 40%Tarefa A: 60%Tarefa B: 20%Tarefa A: 80%Tarefa B: 40%Tarefa A: 100%Tarefa B: 60%Tarefa B: 80%Tarefa B: 100%
ResultadodasegundaexecuçãoTarefa B: 0%Tarefa B: 20%Tarefa B: 40%Tarefa A: 0%Tarefa A: 20%Tarefa A: 40%Tarefa A: 60%Tarefa A: 80%Tarefa A: 100%Tarefa B: 60%Tarefa B: 80%Tarefa B: 100%
Leonardo Murta Threads 9
MaismétodosdaclasseThread• static void sleep(long millis)
– Pausaathreadcorrenteemmilismilissegundos
• void join()– Aguardaaoutrathreadterminar,bloqueandoathreadcorrente
Leonardo Murta Threads 10
Oqueaconteceaqui?
Leonardo Murta Threads 11
Thread t1 = new Thread(new Tarefa("A"));Thread t2 = new Thread(new Tarefa("B"));
t1.start();Thread.sleep(1);t2.start();
Oqueaconteceaqui?
Leonardo Murta Threads 12
Thread t1 = new Thread(new Tarefa("A"));Thread t2 = new Thread(new Tarefa("B"));
t1.start();Thread.sleep(1);t2.start();
Tarefa A: 0%Tarefa A: 20%Tarefa A: 40%Tarefa A: 60%Tarefa A: 80%Tarefa A: 100%Tarefa B: 0%Tarefa B: 20%Tarefa B: 40%Tarefa B: 60%Tarefa B: 80%Tarefa B: 100%
Oqueaconteceaqui?
Leonardo Murta Threads 13
Thread t1 = new Thread(new Tarefa("A"));Thread t2 = new Thread(new Tarefa("B"));
t1.start();t2.start();
System.out.println("Fim da thread principal.");
Oqueaconteceaqui?
Leonardo Murta Threads 14
Thread t1 = new Thread(new Tarefa("A"));Thread t2 = new Thread(new Tarefa("B"));
t1.start();t2.start();
System.out.println("Fim da thread principal.");
Fim da thread principal.Tarefa B: 0%Tarefa A: 0%Tarefa B: 20%Tarefa B: 40%Tarefa B: 60%Tarefa B: 80%Tarefa B: 100%Tarefa A: 20%Tarefa A: 40%Tarefa A: 60%Tarefa A: 80%Tarefa A: 100%
Oqueaconteceaqui?
Leonardo Murta Threads 15
Thread t1 = new Thread(new Tarefa("A"));Thread t2 = new Thread(new Tarefa("B"));
t1.start();t2.start();
t1.join();t2.join();
System.out.println("Fim da thread principal.");
Oqueaconteceaqui?
Leonardo Murta Threads 16
Thread t1 = new Thread(new Tarefa("A"));Thread t2 = new Thread(new Tarefa("B"));
t1.start();t2.start();
t1.join();t2.join();
System.out.println("Fim da thread principal.");
Tarefa A: 0%Tarefa A: 20%Tarefa B: 0%Tarefa A: 40%Tarefa A: 60%Tarefa B: 20%Tarefa A: 80%Tarefa B: 40%Tarefa A: 100%Tarefa B: 60%Tarefa B: 80%Tarefa B: 100%Fim da thread principal.
Modificadorsynchronized• Permitedelimitarregiõescríticasdoprograma• Garantequeummétodonuncaseráexecutadopormaisdeumathreademparalelo
Leonardo Murta Threads 17
Exemplopublic class Contador implements Runnable {
private int numero = 0;private final Set<Integer> numeros = new HashSet<>();private static final int MAX = 10000;
public int proximo() {return numero++;
}
public boolean continua() {return numero < MAX;
}
...
Leonardo Murta Threads 18
Exemplo...
@Overridepublic void run() {
while (continua()) {int proximoNumero = proximo();if (!numeros.add(proximoNumero)) {
System.out.println("Colisão: " + proximoNumero);}
}}
}
Leonardo Murta Threads 19
Oqueaconteceaqui?Runnable contador = new Contador();
for (int i = 0; i < 10; i++) {Thread t = new Thread(contador);t.start();
}
Leonardo Murta Threads 20
Oqueaconteceaqui?Runnable contador = new Contador();
for (int i = 0; i < 10; i++) {Thread t = new Thread(contador);t.start();
}
Leonardo Murta Threads 21
Colisão: 151Colisão: 718Colisão: 874Colisão: 650Colisão: 1034Colisão: 1113Colisão: 1306Colisão: 151Colisão: 1578Colisão: 1754Colisão: 2006...
Eagora?public class Contador implements Runnable {
private int numero = 0;private final Set<Integer> numeros = new HashSet<>();private static final int MAX = 10000;
public synchronized int proximo() {return numero++;
}
public boolean continua() {return numero < MAX;
}
...
Leonardo Murta Threads 22
Eagora?public class Contador implements Runnable {
private int numero = 0;private final Set<Integer> numeros = new HashSet<>();private static final int MAX = 10000;
public synchronized int proximo() {return numero++;
}
public boolean continua() {return numero < MAX;
}
...
Leonardo Murta Threads 23
NenhumaColisão!
Exercício• Façaumaimplementaçãorecursiva(eineficiente)deFibonacci:
• Paralelizeessaimplementaçãousandoduasthreads– Ficoumaisrápido?
Leonardo Murta Threads 24
Threads