Threads

Propaganda
Pool de Threads
Professor: Hyggo Almeida
O que vimos na última aula?
Threads

Sincronização
Pool de Threads
2
O que veremos hoje?
Threads
 Pool
Pool de Threads
3
Pool de Threads
Um pool de threads é uma coleção de threads disponíveis
para realizar tarefas
 Melhor desempenho quando se executa um grande
número de tarefas
 Limitação de recursos disponíveis
Com um pool, não é necessário gerenciar o ciclo de vida das
threads
Pool de Threads
4
Pool de Threads
Como implementar?
 Instanciar uma implementação da interface
ExecutorService



ThreadPoolExecutor
ScheduledThreadPoolExecutor
Pode-se definir...

O número básico e máximo do pool (número de threads)

O tipo de estrutura de dados para armazenar as tarefas

Como tratar tarefas rejeitadas

Como criar e terminar threads
Pool de Threads
5
Pool de Threads
Há métodos fábrica na classe Executors para a criação de
pools...



newFixedThreadPool(int) - Cria um pool com número fixo de
threads e fila ilimitada de tarefas
newCachedThreadPool() - Cria um pool de threads sem limite,
com recuperação automática de threads

É uma boa opção quando há muitas tarefas pequenas a executar
assincronamente.

Threads não usadas por 60 segundos são removidas
newSingleThreadExecutor() - Cria uma thread única em
background com fila ilimitada de tarefas

As tarefas serão executadas seqüencialmente
Pool de Threads
6
Pool de Threads

Exemplo com Runnable
public class WorkerThread implements Runnable {
private int workerNumber;
public WorkerThread(int number) {
workerNumber = number;
}
public void run() {
for (int i=0;i<=100;i+=20) {
// Realiza algum trabalho...
System.out.println(“Worker:” + workerNumber + ", %: " + i);
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {}
}
}
}
Pool de Threads
7
Pool de Threads

Exemplo com Runnable

2 threads e 5 tarefas
import java.util.concurrent.*;
public class ThreadPoolTest {
public static void main(String[] args) {
ExecutorService tpes = Executors.newFixedThreadPool(2);
WorkerThread[] workers = new WorkerThread[5];
for (int i = 0; i < workers.length; i++) {
workers[i] = new WorkerThread(i);
tpes.execute(workers[i]);
}
tpes.shutdown();
}
}
Pool de Threads
8
Pool de Threads

Vamos implementar o exemplo com Runnable
Pool de Threads
9
Pool de Threads

Exemplo com Callable
import java.util.concurrent.*;
public class CallableWorkerThread implements Callable {
private int workerNumber;
public CallableWorkerThread(int number) {
workerNumber = number;
}
public Object call() {
for (int i = 0; i <= 100; i += 20) {
// Realiza algum trabalho...
System.out.println(“Worker:” + workerNumber + ", %: " + i);
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {}
}
return(new Integer(workerNumber));
}
}
Pool de Threads
10
Pool de Threads

Exemplo com Callable
public class ThreadPoolTest2 {
public static void main(String[] args) {
ExecutorService tpes = Executors.newCachedThreadPool();
CallableWorkerThread workers[] = new CallableWorkerThread[4];
Future futures[] = new Future[4];
for (int i = 0; i < workers.length; i++) {
workers[i] = new CallableWorkerThread(i);
futures[i]=tpes.submit(workers[i]);
}
for (int i = 0; i < workers.length; i++) {
try {
System.out.println("Ending worker: " +futures[i].get());
} catch (Exception e) {}
}
tpes.shutdown();
}
}
Pool de Threads
11
Pool de Threads

Vamos implementar o exemplo com Callable
Pool de Threads
12
O que vimos hoje?
Threads
 Pool
Pool de Threads
13
Dúvidas?
?
Pool de Threads
14
Download