aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads •...

25
Threads Leonardo Gresta Paulino Murta [email protected]

Transcript of aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads •...

Page 1: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma

Threads

[email protected]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Exercício• Façaumaimplementaçãorecursiva(eineficiente)deFibonacci:

• Paralelizeessaimplementaçãousandoduasthreads– Ficoumaisrápido?

Leonardo Murta Threads 24

Page 25: aula12 - Threads - UFFleomurta/courses/poo/aula12.pdf · Java em um único processo Threads • São processos leves • Compartilham recursos • Um processo é composto por uma

Threads

[email protected]