programación orientada a sesión 8.1: …...threads em java threads 6 •interface runnable...

25
Programación Orientada a Objetos Prof. Herminio Paucar Prof. Edson Huillca Sesión 8.1: Programación de hilos Threads

Upload: others

Post on 16-Mar-2020

26 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Programación Orientada a Objetos

Prof. Herminio PaucarProf. Edson Huillca

Sesión 8.1: Programación de hilosThreads

Page 2: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Aula de hoje

Threads 2

• Estudaremos a execução em paralelo de programas em Java por meio de Threads

Page 3: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Por que usar Threads?

• Threads permitem

processamento

paralelo

– Podemos rodar mais de uma tarefa ao mesmo tempo

– Podemos tirar proveito dos vários processadores do nosso computador para rodar mais rápido uma tarefa

Threads 3

Page 4: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Processos vs. Threads

Threads 4

Processos

• Ambiente autocontido

• Espaço próprio de memória

• Cada aplicação que roda no sistema operacional é um processo em separado

• A JVM roda seu programa Java em um único processo

Threads

• São processos leves

• Compartilham recursos

• Um processo é

composto por uma ou

mais threads

• O seu programa Java inicia em uma thread principal mas pode abrir threads adicionais

Page 5: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Execução de Threads

Thread 1 Thread 2

Computador single core (compartilhamento de tempo)

CPU1

CPU2

Computador dual core (paralelismo real)

CPU1

Threads 5

Page 6: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Threads em Java

Threads 6

• Interface Runnable

– Permite criar classes que podem ser executadas em threads separadas

– Contem um único método, que deve ser

implementado com o código da tarefa: run()

• Classe Thread– Controla a criação e execução de threads

– Recebe um objeto Runnable como parâmetro

– Contém o método start(), que chama o método run() do objeto Runnable em uma thread em separado

Page 7: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Exemplo

Threads 7

public class Tarefa implements Runnable { private final String nome; public Tarefa(String nome) { this.nome = nome; }

@Override public void run() { for (int i = 0; i <= 100; i = i + 20) { System.out.println("Tarefa " +

nome + ": " + i + "%"); } }}

Page 8: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Exemplo

Threads 8

• Criação das threads

Thread t1 = new Thread(new Tarefa("A"));Thread t2 = new Thread(new Tarefa("B"));

t1.start();

t2.start();

Page 9: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Exemplo

Threads 9

Tarefa A: 0% Tarefa B: 0%Tarefa A: 20% Tarefa B: 20%Tarefa B: 0% Tarefa B: 40%Tarefa A: 40% Tarefa A: 0%Tarefa A: 60% Tarefa A: 20%Tarefa B: 20% Tarefa A: 40%Tarefa A: 80% Tarefa A: 60%Tarefa B: 40% Tarefa A: 80%Tarefa A: 100% Tarefa A: 100%Tarefa B: 60% Tarefa B: 60%Tarefa B: 80% Tarefa B: 80%Tarefa B: 100% Tarefa B: 100%

Resultado da primeira execução Resultado da segunda execução

Page 10: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Mais métodos da classe Thread

Threads 10

• static void sleep(long millis)– Pausa a thread corrente em milis milissegundos

• void join()– Aguarda a outra thread terminar, bloqueando a

thread corrente

Page 11: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

O que acontece aqui?

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: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

O que acontece aqui?

Thread t1 = new ThreaThread t2 = new Threa

;

;d(new Tarefa("A"))

d(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%

12

Page 13: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

O que acontece aqui?

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: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

O que acontece aqui?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.");

Threads 14

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: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

O que acontece aqui?

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: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

O que acontece aqui?

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: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Modificador synchronized

Threads 17

• Permite delimitar regiões críticas do programa

• Garante que um método nunca será executado por mais de uma thread em paralelo

Page 18: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Exemplo

Threads 18

public class Contador implements Runnable {

HashSet<>();private private private

int numero = 0;final Set<Integer> numeros = new static final int MAX = 10000;

public int proximo() { return numero++;

}

public boolean continua() { return numero < MAX;

}

...

Page 19: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Exemplo

Threads 19

...

proximoNumero);

@Overridepublic void run() {

while (continua()) {

int proximoNumero = proximo();if (!numeros.add(proximoNumero)) {

System.out.println("Colisão: " +

}

}

}}

Page 20: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

O que acontece aqui?

Threads 20

Runnable contador = new Contador();

for (int i = 0; i < 10; i++) { Thread t = new Thread(contador); t.start();

}

Page 21: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

O que acontece aqui?

Threads 21

Runnable contador = new Contador();

for (int i = 0; i < 10; i++) { Thread t = new Thread(contador); t.start();

}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: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

E agora?

Threads 22

public class Contador implements Runnable {

HashSet<>();private private private

int numero = 0;final Set<Integer> numeros = new static final int MAX = 10000;

public synchronized int proximo() { return numero++;

}

public boolean continua() { return numero < MAX;

}

...

Page 23: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

E agora?public class Contador implements Runnable {

private private private

int numero = 0;final Set<Integer> numeros = new HashSet<>(); static final int MAX = 10000;

public synchronized int proximo() { return numero++;

}

public boolean continua() { return numero < MAX;

}

...

Nenhuma Colisão!

Threads 23

Page 24: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Exercício

• Faça uma implementação recursiva (e ineficiente) de Fibonacci:

• Paralelize essa implementação usando duas threads– Ficou mais rápido?

Threads 24

Page 25: Programación Orientada a Sesión 8.1: …...Threads em Java Threads 6 •Interface Runnable –Permite criar classes que podem ser executadas em threads separadas –Contem um único

Bibliografia

Organização de Programas em Java

25

• Prof. Leonardo Gresta Paulino Murta, Programação Orientada a Objetos, UFF, Brasil

• Prof. Anselmo Montenegro Programação Orientada a Objetos, UFF, Brasil

• Java como Programar, Deitel & Deitel, Pearson, Edição: 9ª Ed.

• Use a Cabeça! Java, Kathy Sierra e Bert Bates, Alta Books, 2ª Ed., 2012