programación orientada a sesión 8.1: …...threads em java threads 6 •interface runnable...
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/1.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/2.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/3.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/4.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/5.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/6.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/7.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/8.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/9.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/10.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/11.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/12.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/13.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/14.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/15.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/16.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/17.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/18.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/19.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/20.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/21.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/22.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/23.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/24.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022040516/5e75d801317a4b1454639ae3/html5/thumbnails/25.jpg)
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