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 •...
![Page 2: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/2.jpg)
Auladehoje• EstudaremosaexecuçãoemparalelodeprogramasemJavapormeiodeThreads
Leonardo Murta Threads 2
![Page 3: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/3.jpg)
PorqueusarThreads?• Threadspermitemprocessamentoparalelo– Podemosrodarmaisdeumatarefaaomesmotempo
– Podemostirarproveitodosváriosprocessadoresdonossocomputadorpararodarmaisrápidoumatarefa
Leonardo Murta Threads 3
![Page 4: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/4.jpg)
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
![Page 5: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/5.jpg)
ExecuçãodeThreads
Leonardo Murta Threads 5
Thread 1 Thread 2
Computador single core(compartilhamento de tempo)
Computador dual core(paralelismo real)CPU1
CPU2
CPU1
![Page 6: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/6.jpg)
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
![Page 7: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/7.jpg)
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
![Page 8: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/8.jpg)
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
![Page 9: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/9.jpg)
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
![Page 10: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/10.jpg)
MaismétodosdaclasseThread• static void sleep(long millis)
– Pausaathreadcorrenteemmilismilissegundos
• void join()– Aguardaaoutrathreadterminar,bloqueandoathreadcorrente
Leonardo Murta Threads 10
![Page 11: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/11.jpg)
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();
![Page 12: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/12.jpg)
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%
![Page 13: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/13.jpg)
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.");
![Page 14: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/14.jpg)
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%
![Page 15: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/15.jpg)
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.");
![Page 16: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/16.jpg)
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.
![Page 17: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/17.jpg)
Modificadorsynchronized• Permitedelimitarregiõescríticasdoprograma• Garantequeummétodonuncaseráexecutadopormaisdeumathreademparalelo
Leonardo Murta Threads 17
![Page 18: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/18.jpg)
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
![Page 19: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/19.jpg)
Exemplo...
@Overridepublic void run() {
while (continua()) {int proximoNumero = proximo();if (!numeros.add(proximoNumero)) {
System.out.println("Colisão: " + proximoNumero);}
}}
}
Leonardo Murta Threads 19
![Page 20: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/20.jpg)
Oqueaconteceaqui?Runnable contador = new Contador();
for (int i = 0; i < 10; i++) {Thread t = new Thread(contador);t.start();
}
Leonardo Murta Threads 20
![Page 21: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/21.jpg)
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...
![Page 22: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/22.jpg)
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
![Page 23: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/23.jpg)
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!
![Page 24: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma](https://reader033.fdocumentos.tips/reader033/viewer/2022051511/6019fcba6636232716413fd5/html5/thumbnails/24.jpg)
Exercício• Façaumaimplementaçãorecursiva(eineficiente)deFibonacci:
• Paralelizeessaimplementaçãousandoduasthreads– Ficoumaisrápido?
Leonardo Murta Threads 24