O documento discute threads em programação concorrente. Explica que threads são fluxos de execução paralelos que melhoram o desempenho de aplicativos. Detalha como criar threads usando a classe Thread ou a interface Runnable e mostra exemplos de código Java que geram números aleatórios em threads paralelas.
3. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
THREADS
Threads
Detalhes:
• No desenvolvimento de software, precisamos muitas vezes efetuar
operações paralelas.
• Executando operações paralelas, nosso programa continua seu
processamento natural enquanto espera a conclusão de outras atividades.
• Os processos paralelos podem ser definidos como um fluxo de controle
ativo dentro do nosso programa.
4. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
THREADS
Threads
Processo 1
Processo 2
Processo 3
Sem Threads
Processo 1
Processo 2
Processo 3
Programa Principal
Com Threads
5. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
O que é?:
THREADS
É fluxo alternativo e ativo dentro do nosso programa que executa
paralelamente com o software principal e outros fluxos. Possui um bloco de
instruções ou comandos que serão executados.
6. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Detalhes:
• Isso é a base de Programação Concorrente.
• Conhecido como multiprogramação.
• Boa parte das aplicações desenvolvidas nos dias atuais, utiliza de threads
para processamento de informações e melhoria de performance.
• Tarefas podem ser paralelizadas em vários fluxos.
• Tarefas podem ser distribuídas quando utilizamos threads.
• Hoje grandes aplicações trabalham com threads, muitas delas distribuídas
em computadores diferentes.
• São compostas por instruções de comandos de uma linguagem. No nosso
caso o Java.
• Aproveitamos melhor os recursos de um sistema operacional.
THREADS
7. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Detalhes:
THREADS
• São conhecidas como processos leves.
• Como foi dito, fazem parte do programa principal ou processo tradicional.
• Possuem prioridades.
• Podem possuir um identificador.
• Podemos iniciar, parar ou colocar uma thread em espera.
• São gerenciadas pelo sistema operacional.
8. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Ciclo de Vida:
THREADS
Fonte: http://www3.ntu.edu.sg/home/ehchua/programming/java/j5e_multithreading.html
9. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Criando uma Thread:
THREADS
public class ExemploThread extends Thread {
@Override
public void run() {
}
}
• Para criar uma Thread utilizamos a classe Thread.
• As instruções de execução de uma Thread são desenvolvidas dentro do
método run().
Método que será executado pela Thread
Classe Thread
10. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 01
package edu.anhanguera.prc.aula03;
public class ExemploThread extends Thread {
@Override
public void run() {
System.out.println("Executando ExemploThread");
}
public static void main(String[] args) {
ExemploThread exemploThread = new ExemploThread();
exemploThread.start();
}
}
11. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Detalhes:
• Neste modelo, utilizamos uma classe como herança.
• Caso seja necessário utilizar outra classe como herança, podemos ter
problemas, pois o Java não possui herança múltipla.
• Para iniciar uma Thread utilizamos o método start().
THREADS
12. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Criando uma Thread:
THREADS
• Podemos utilizar uma outra forma de criar uma Thread: utilizando a
interface Runnable.
public class ExemploRunnable implements Runnable {
public void run() {
}
}
Método que será executado pela Thread
Interface Runnable
13. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 02
package edu.anhanguera.prc.aula03;
public class ExemploRunnable implements Runnable {
public void run() {
System.out.println("Executando ExemploRunnable");
}
public static void main(String[] args) {
ExemploRunnable exemploRunnable = new ExemploRunnable();
Thread thread = new Thread(exemploRunnable);
thread.start();
}
}
14. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Detalhes:
• Neste modelo utilizamos uma interface.
• Caso seja necessário utilizar outra classe como herança ou até mesmo uma
interface não teremos problemas.
• Esta é a melhor forma de criar e utilizar Threads.
• Precisamos instanciar a classe Thread e passar como argumento a classe
com a interface Runnable implementada.
• Para iniciar uma Thread utilizamos o método start() da classe Thread.
THREADS
15. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 03
package edu.anhanguera.prc.aula03;
import java.util.concurrent.ThreadLocalRandom;
public class ExemploNumIntRandomico implements Runnable {
public static int parar = 0;
public void run() {
while (parar == 0) {
int num = ThreadLocalRandom.current().nextInt(0, 9);
System.out.println("Numero: " + num);
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
}
}
public static void main(String[] args) {
ExemploNumIntRandomico numIntRandomico = new ExemploNumIntRandomico();
Thread thread = new Thread(numIntRandomico);
thread.start();
}
}
16. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
• O comando Thread.sleep é estático.
• Sua principal função é deixar a Thread pausada ou adormecida durante um
período de tempo.
• O parâmetro do método é a quantidade de milissegundos que a Thread
deve ficar adormecida.
THREADS
Detalhes:
17. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 04
package edu.anhanguera.prc.aula03;
import java.util.concurrent.ThreadLocalRandom;
public class ExemploNumDoubleRandomico implements Runnable {
public static int parar = 0;
public void run() {
while (parar == 0) {
double num = ThreadLocalRandom.current().nextDouble(0, 9);
System.out.println("Numero: " + num);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
}
}
public static void main(String[] args) {
ExemploNumDoubleRandomico randomico = new ExemploNumDoubleRandomico();
Thread thread = new Thread(randomico);
thread.start();
}
}
18. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula03;
public class ExemploNumerosRandomicos {
public static void main(String[] args) {
ExemploNumDoubleRandomico doubleRandomico = new ExemploNumDoubleRandomico();
ExemploNumIntRandomico intRandomico = new ExemploNumIntRandomico();
Thread threadDouble = new Thread(doubleRandomico);
threadDouble.start();
Thread threadInt = new Thread(intRandomico);
threadInt.start();
try {
Thread.sleep(10000);
ExemploNumDoubleRandomico.parar = 1;
System.out.println("ExemploNumDoubleRandomico finalizado");
Thread.sleep(10000);
ExemploNumIntRandomico.parar = 1;
System.out.println("ExemploNumIntRandomico finalizado");
} catch (InterruptedException e) {}
}
}
19. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Resumo
• Threads são blocos de instruções que executam em paralelo ao programa
principal.
• Ajudam na performance de um aplicação.
• As Threads possuem um ciclo de vida.
• Podemos utilizar a classe Thread ou a interface Runnable para implementar
uma Thread.
THREADS