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!