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

Post on 29-Sep-2020

17 views 0 download

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

Threads

LeonardoGrestaPaulinoMurtaleomurta@ic.uff.br

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

LeonardoGrestaPaulinoMurtaleomurta@ic.uff.br