Dúvida utilizando Pool de Threads

Bom dia Senhores,

Estou com uma dúvida com relação ao Pool de Threads da classe ExecutorService.

Ambiente:
Tenha uma conexão UDP que fica recebendo pacote de uma determinada porta.
Sempre que um pacote chega eu realizo a criação de uma Thread para consumir esse pacote.
A quantidade maximo de Thread que o sistema deve abrir seria 10.
Se as 10 Threads estiverem ocupadas então o sistema deve aguardar até que uma das Threads seja liberada para processa o pacote.

Duvida:
Após realizar a implementação, me parece que a classe ExecutorService apenas impede a quantidade de Threads executando em paralelo, e não a quantidade máxima de Threads que devem ser utilizadas pelo Pool.

Pelo que percebo, póde existir um momento no qual 1000 Threads são criadas, no entanto, apenas 10 estão em execução.

public static void main(String[]args) throws IOException, SQLException, InterruptedException{
		
		ConnectionServer conexao = new ConnectionServer();
		conexao.loadServerProperties("server");
		conexao.openListenerUDP();
		
		ConnectionFactoryDatabase.loadDataSourceProperties("database");
		ConnectionFactoryDatabase.openConnectionDatabase();
		
		ThreadCheckSalvePackage.loadThreadsProperties("threads");
		
		ExecutorService poolThreads = Executors.newFixedThreadPool(ThreadCheckSalvePackage.getMaxThreads());

		while(true) {
	        	String  bufferPackage = conexao.getPackageUDP();
	                poolThreads.execute(new ThreadCheckSalvePackage(bufferPackage));
	    }
	}

Ou sera que estou enganado e a implementação acima realiza exatamente oq desejo?

Existe algum metodo da classe ExecutorService no qual o sistema fica em Sleep aguardando alguma Thread do Pool ser Liberada?

Obs: public class ThreadCheckSalvePackage implements Runnable
Obrigado.

Uai, o que você fez aparentemente está certo.

Só se essa classe que você instanciou via “new ThreadCheckSalvePackage(bufferPackage)” também cria uma thread; nesse caso, você provavelmente vai ter problemas.

Se você olhar, deve haver no máximo N threads processando os dados simultaneamente. Use algum programa que permita olhar quantas threads estão no ar para um determinado processo. Por exemplo, o jvisualvm ou o jconsole, que estão disponíveis no diretório bin do seu JDK (não da JRE, que não vem com essas coisas).

Dica: não encapsule arrays de bytes em strings, a menos que o conteúdo em bytes tenha sido criado originalmente a partir de uma string. Você pode ter problemas com isso.

Não, o fixedThreadPool define um número máximo de threads, como você pode ler no JavaDoc:
NewFixedThreadPool.

Entretanto, é como o entanglement falou. Ele só gerencia as threads que o próprio pool criar e destruir. Se sua thread dispara mais threads, aí o pool não poderá fazer nada à respeito.

Legal, entedi.

Obs: A classe ThreadCheckSalvePackage não cria Threads, ela apenas implementa a interface Runnable e salva o Pacote no banco de dados através do metodo public void run().

Então, teoricamente a implementação realiza oq desejo.

Vou testar agora através do jvisualvm ou o jconsole ( conforme sugestão do entanglement ) se isso ocorre na prática.

Obrigado Entanglement e ViniGodoy pelos esclarecimentos.

Funcionou perfeitamente.

Jvisualvm é uma ótima ferramenta, obrigado pela dica.