Problema usando ThreadPoolExecutor

0 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<Runnable>());
	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();
		}
	}
}

}

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!

Criado 2 de janeiro de 2007
Respostas 0
Participantes 1