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 q 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 q 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 q Vamos implementar o exemplo com Runnable Pool de Threads 9 Pool de Threads q 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 q 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 q 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