Pool de Threads

2 respostas
A

Olá,

Estou fazendo um servidor em que uso um poll de threads pa executar a classe que trata as requisicoes. Estou usando o ThreadPoolExecutor, do pacote java.util.concurrent.

o problema que estou tendo é que apenas uma thread do pool está ficando ativa, mesmo quando coloco varios clientes para enviar requisicoes ao servidor. Assim o que esta acontecendo é que as threads esta sendo executadas em fila, uma apos a outra, em vz de paralelamento.

Segue o codigo do servdor e do da classe que executa quando um cliente conecta. Ela foi feita soh pra testar e soh conta de 0 a 9.

public class ServidorThread implements Runnable{

public static final int PORTA_TRANSACOES_DEFAULT = 8000;

public static final int TIMEOUT_DEFAULT = 300; //30 segundos

public static final String IP = localhost;
//parametros do pool de threads

public static final int CORE_POOL_SIZE = 10;

public static final int MAX_POOL_SIZE = Integer.MAX_VALUE;

public static final int KEEP_ALIVE = 30;

private ThreadPoolExecutor threadpool;
private ServerSocket escuta;

public void init(int porta, int timeout){

try {

this.escuta = new ServerSocket(porta,timeout);

} catch (IOException e) {

Log.error(this.getClass(), Não se pode fazer escuta na porta+porta);

e.printStackTrace();

}
this.threadpool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, new SynchronousQueue());

this.threadpool.prestartAllCoreThreads();

}
public void init(){

init(PORTA_TRANSACOES_DEFAULT, TIMEOUT_DEFAULT);

}
public void run(){

Log.info(this.getClass(), "Iniciando escuta na porta "+this.escuta.getLocalPort());

while (true){

try {

Socket conexao = escuta.accept();

Log.info(this.getClass(), “Conexao estabelecida com o cliente “+conexao.getInetAddress()
+”:”+conexao.getPort()+" na porta local "+conexao.getLocalPort());

TratadorRequisicao tratador = new TratadorRequisicao(conexao);

this.threadpool.execute(tratador);

System.out.println("Threads ativas = "+this.threadpool.getActiveCount());

} catch (IOException e) {

Log.error(this.getClass(), Erro ao estabelecer conexão com o cliente.);

this.threadpool.shutdown();

e.printStackTrace();

}

}

}

}

/Apenas conta de 0 a 9 soh para testar/
public class TratadorRequisicao implements Runnable {

private Socket conexao;

private BufferedReader entrada;

private PrintStream saida;

private ByteBuffer bufferEntrada;

private ByteBuffer bufferSaida;
public TratadorRequisicao(Socket conexao) {

this.conexao = conexao;

this.bufferEntrada = ByteBuffer.allocateDirect(MAX_TAMANHO_REQUISICAO);

this.bufferSaida = ByteBuffer.allocateDirect(MAX_TAMANHO_REQUISICAO);

}
public void run() {

for (int i = 0; i < 10; i++) {

System.out.println(""+i);

}

}

Alguem pode me ajudar?

Valeu!

2 Respostas

ViniGodoy

Para criar o seu ExecutorService use um dos métodos fábrica da classe Executors:

ExecutorService threadPool = Executors.newCachedThreadPool();

O cachedThreadPool alocará threads a medida que seu sistema for precisando. O fixed limita o pool a um número máximo de threads, o single limita a uma só thread e o finalmente scheduled, que permite agendamento de Threads.

Sempre referencie seu ThreadPoolExecutor através da interface ExecutorService, assim você poderá trocar a política do Pool no futuro, se desejar.

A

valeu vinigodoy, resolveu meu problema!

Criado 3 de janeiro de 2007
Ultima resposta 3 de jan. de 2007
Respostas 2
Participantes 2