Bom dia pessoal.
Estou com um trabalho de fazer um serviço (aplicativos rodados em background a partir do console, iniciados pelo cron) que vai carregar alguns arquivos e distribuir seus dados em várias tabelas do banco.
Ele já está funcionando, porém acho que um pouco lerdo demais. Dessa forma decidi implementá-lo com threads.
O que estou programando no momento é ele pegar o grupo de arquivos, dele tirar um grupo de linhas relacionadas, manda-lo para classes parsers dos arquivos e finalmente pegar o resultado e criar uma thread que vai salvar no banco.
Bem, daí surgem vários problemas. Tenho que controlar o número de threads ou sofro de OutOfMemoryError. Também tenho que controlar o número de conexões abertas pois o banco já está trabalhando no limite.
Sobre o primeiro planejei da seguinte forma:
package threads;
import java.util.Random;
public class ExemploProcessadores
{
static int count = 0;
public static void main(String[] args)
{
ExemploProcessadores main = new ExemploProcessadores();
main.executar();
}
public void executar()
{
ThreadGroup tg = new ThreadGroup("PROCESSADORES");
while (true)
{
if (tg.activeCount() > 25)
{
synchronized (this)
{
try
{
wait();
}
catch (InterruptedException ex)
{}
}
System.out.println("Continuando... " + tg.activeCount() + " - " + count);
}
Thread proc = new Thread(tg, new Processador());
proc.start();
}
}
class Processador extends Thread
{
public void run()
{
try
{
sleep(new Random().nextInt(10) * 1000);
}
catch (InterruptedException ex)
{}
count++;
notify();
}
}
}
Eu paro a criação de novas threads contando quantas já estão ativas. Quando alguma thread me nottificar que ela terminou de processar, eu retomo. Bem, do jeito que está não funciona. Eu não sei como acordar threads devidamente.
Para funcionar, tenho que colocar wait com algum valor, como wait(1000); e retirar o notify() ou o notifyAll() da thread. Com um valor suficientemente alto de threads até que ele vai bem (não para).
Agora para o segundo problema, não achei solução ainda. Gostaria de reaproveitar a thread(a conexão que passei para ela). Algo como "quando o processamento deste lote acabar, notifico alguém para me fornecer mais dados para trabalhar, e então continuo".
Sugestões?
Ahhh! Um detalhe pequeno: Tem que rodar em Java 1.4. :lol:
… mas quanto ao segundo problema, de reaproveitar a conexão aberta, se você criar um pool de conexões, ele não faria isso pra você?