Fala povo, estou tendo um problema e gostaria de compartilhar com o pessoal que entende tudo de thread.
Tenho uma aplicação na qual preciso realizar muitas ‘tarefas’, mas muitos. Para tal eu tenho o seguinte código (± pois algumas coisas foram omitidas).
ExecutorService es = Executors.newFixedThreadPool(threadSize);
do{
Long cod = nextCodService();
if(cod != null){
MinhaClasseRunnable minhaThread = new MinhaClasseRunnable(cod);
es.submit(minhaThread);
Thread.Sleep(50);
}else{
Thread.Sleep(1000);
}
}while(true);
Dentro da classe MinhaClasseRunnable tem um trecho de código que também usa Thread pois preciso setar um TimeOut para a thread:
...
ExecutorService es = Executors.newSingleThreadScheduledExecutor();
MinhaClasseCallable minhaThread = new MinhaClasseCallable(urlParse);
Future<String> future = es.submit(minhaThread);
es.shutdown();
String page = future.get(60, TimeUnit.SECONDS);
...
Bom a idéia ter um pool de threads para ir usando conforme o doWhile vai criando as threads…
No segundo trecho de código eu crio um Thread (interna) a que foi lançada pois em alguns casos o tempo para finalizar uma thread pode ser grande (+2min, o normal é cerca de 10sec) e fique com medo de por exemplo setar ThreadSize com 20 e ter o azar de em determinado momento da execução ter as 20 threads aguardando (2min) para serem finalizadas e ainda ter muitos trabalhos ainda para serem tratados pelas threads… hehehhe isso realmente aconteceu quando eu não tinha essa thread interna.
Bom o que acontece é o seguinte:
O código em si funciona legal porém tenho 2 micros um ± e outro ± para -, hehehehe…No ± a CPU dá uma subida no inicio mas depois vai abaixando com o tempo e fica estável. No segundo que é um pouco inferior (não muito) a CPU fica colada em 100% o tempo todo…
Para vocês terem uma idéia eu cortei a quantidade de ThreadSize pela metade e ainda assim continua com CPU alta…o problema é que eu sei que esse micro agüentaria sim a quantidade de Thread normal ainda mais dividido pela metade.
Eu desconfio que a forma como as Threads são criadas, uma atrás da outra é que estão afetando esse micro, como está chegando várias Threads ao mesmo tempo, a CPU fica mais tempo tentando trocar uma thread pela outra do que realmente trabalhando…Talvez a Thread interna acabe por dobrar a quantidade total de Threads no sistema ao mesmo tempo, afinal para cada Thread externa (principal) eu tenho uma interna mesmo que na maioria das vezes elas rodem rápido (cerca de 10sec).
O que vocês acham ???
Até +