ThreadPool Java

Na área de computação, quando precisamos executar uma tarefa em paralelo, onde “tarefa” seria nossa programação, usamos as threads. Porém sem um gerenciador, um programa pode abrir threads até esgotar os recursos da máquina, ou causar lentidões na mesma. Para gerenciar o uso das threads podemos utilizar o thread pool.

Thread pool é o lugar onde um número determinado de threads são criadas para executarem nossas tarefas, que são organizadas em filas. Geralmente, existem mais tarefas a serem executadas do que threads em nosso gerenciador, portanto assim que a tarefa é finalizada o gerenciador requisitará a próxima tarefa da fila, até que todas sejam executadas, ficando no aguardo de uma nova ou finalizando o gerenciador.

O número de threads que nosso thread pool terá pode ser alterado de acordo com o funcionamento de nosso projeto, nem sempre muitas threads significam performance, fazendo uma analogia, se fizermos download de vários arquivos ao mesmo tempo, podemos esperar muito tempo para conseguir visualizar um único arquivo. Porem isso é assunto para outro post.

No java, para criar nosso thread pool podemos utilizar o ExecutorService.

Fiz um exemplo básico para mostrar seu funcionamento, você pode alterar de acordo com sua curiosidade:

Do thread pool usaremos os comandos:

//Criando o thread pool
ExecutorService threadPool = Executors.newFixedThreadPool(tamanhoDoPool);

//Adicionando uma tarefa a ser executada
threadPool.execute(tarefas[i]);

//desativando o thread pool, onde irá esperar até que todas as threads em execução sejam finalizadas
threadPool.shutdown();

Vamos criar uma classe chamada ThreadPoolTeste

import java.util.concurrent.*;

public class ThreadPoolTeste {
	public static void main(String[] args) {
		//Variável que vai guardar o número de tarefas a serem executadas
		int numeroDeTarefas = 4;

		//Variável criada para definir quantas threads serão criadas dentro do thread pool
		int tamanhoDoPool = 2;
                
		//Classe que usaremos para criar onde vamos passar o número de threads que desejamos
		//que ela gerencie.
		ExecutorService threadPool = Executors.newFixedThreadPool(tamanhoDoPool);

		//Faremos um array para executar múltiplas tarefas
		TarefasThread[] tarefas = new TarefasThread[numeroDeTarefas];
		
		//Com o looping iremos executar todas as tarefas de acordo com a variavel  numeroDeTarefas
		for (int i = 0; i < numeroDeTarefas; i++) {
			//Instanciando a thread do array
			tarefas[i] = new TarefasThread(i);
			
			//Como adicionar a thread no thread pool
			threadPool.execute(tarefas[i]);
		}
		
		//Executar esse comando quando desejar desativar o threadpool
		//Ele irá terminar as threads que estão em execução e depois de destruir.
		threadPool.shutdown();
	}
}

Vamos criar nossa classe que será nossa tarefa a TarefasThread implementando Runnable:

public class TarefasThread implements Runnable {
	//Variável para identificar a tarefa
	private int numeroDaTarefa;

	TarefasThread(int numero) {
     		//Vamos armazenar o número da tarefa para identificarmos a execução
		numeroDaTarefa = numero;
	}

	public void run() {
		//Faremos um looping para emular uma tarefa qualquer
		for (int i = 0; i <= 100; i += 20) {
		
			//Mostrando a situação atual da tarefa
			System.out.println("Numero da Tarefa: " + numeroDaTarefa + ", porcentagem completa: " + i);
			
			try {
				//Executar uma espera para  visualizar o efeito do thread pool
				Thread.sleep((int) (Math.random() * 1000));
			} catch (InterruptedException e) {
			}
		}
	}
}

Resultado, como nosso thread pool tem somente 2 threads a tarefa “2” foi executada somente quando terminou a tarefa “0”:

Numero da Tarefa: 0, porcentagem completa: 0
Numero da Tarefa: 1, porcentagem completa: 0
Numero da Tarefa: 0, porcentagem completa: 20
Numero da Tarefa: 1, porcentagem completa: 20
Numero da Tarefa: 1, porcentagem completa: 40
Numero da Tarefa: 0, porcentagem completa: 40
Numero da Tarefa: 0, porcentagem completa: 60
Numero da Tarefa: 0, porcentagem completa: 80
Numero da Tarefa: 1, porcentagem completa: 60
Numero da Tarefa: 1, porcentagem completa: 80
Numero da Tarefa: 0, porcentagem completa: 100
Numero da Tarefa: 2, porcentagem completa: 0
Numero da Tarefa: 1, porcentagem completa: 100
Numero da Tarefa: 3, porcentagem completa: 0
Numero da Tarefa: 2, porcentagem completa: 20
Numero da Tarefa: 2, porcentagem completa: 40
Numero da Tarefa: 3, porcentagem completa: 20
Numero da Tarefa: 2, porcentagem completa: 60
Numero da Tarefa: 2, porcentagem completa: 80
Numero da Tarefa: 2, porcentagem completa: 100
Numero da Tarefa: 3, porcentagem completa: 40
Numero da Tarefa: 3, porcentagem completa: 60
Numero da Tarefa: 3, porcentagem completa: 80
Numero da Tarefa: 3, porcentagem completa: 100

7 comentários em “ThreadPool Java

  • 23 de novembro de 2011 em 18:05
    Permalink

    Aloha! My colleague has recommended me to read your blog. And I’d like to say that I really respect what you’re posting here.

    Resposta
  • 7 de março de 2012 em 07:38
    Permalink

    hey there, i liked you blog, it is kinda good. keep up the work.

    Resposta
  • 7 de março de 2012 em 07:58
    Permalink

    that was a lovely article. i liked reading it. thanks for sharing.

    Resposta
  • 9 de novembro de 2012 em 06:15
    Permalink

    Lucas, encontrei seu blog procurando uma solução para um problema e acredito que resolverei estudando este artigo. Se puder me dar uma luz eu apreciaria muito. Meu programa é um sistema de upload de imagens para meu servidor. Atualmente os arquivos são selecionados e enviados para o servidor em uma thread. O que quero fazer é o seguinte. Para cada arquivo selecionado é criado uma thread (ftp) ou pool com as tarefas (ftp) e quando for realmente fechar o pedido eu já tenha alguns arquivos enviados.

    Resposta
  • 9 de novembro de 2012 em 08:13
    Permalink

    Ola tudo bom? O Threadpool controla a quantidade de threads que seu sistema está usando para não sobrecarregando a infra, seria bom tentar trabalhar com somente 1 threadpool e todas as threads serem executados por ele. Você deve ter uma Thread principal(PAI) com a uma variável Threadpool, assim que forem acionados os pedidos de upload, você pode abrir uma thread filha com quais arquivos são necessários para upload, essa thread filha irá abrir uma nova thread para cada upload. Porem todas as threads devem ser executadas pelo threadpool que está na PAI.

    Resposta
  • 27 de novembro de 2012 em 05:33
    Permalink

    Bom dia Lucas, consegui implementar o pool. Esta funcionando assim: A cada arquivo selecionado envio uma tarefa para o pool, até ai tudo funciona, porem quando finalizo a seleção e passo para finalização exibo um scroolpanel com as miniaturas das imagens e uma barra de progresso para cada, até ai tudo funciona. Porém qualquer tentativa de monitorar o fim das tarefas (na classe principal) para encerrar o programa, o applet para de atualizar e trava até o fim das tarefas. A dias tento resolver isto e não consigo. Tem alguma ideia, pode me ajudar?

    Resposta

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Blue Captcha Image
Atualizar

*

Facebook

Get the Facebook Likebox Slider Pro for WordPress
WordPress SEO fine-tune by Meta SEO Pack from Poradnik Webmastera