Ajuda thread

Estou precisando de uma ajuda…
O problema é este:
Tenho que pegar no banco uma quantidade x de linhas de uma determinada tabela, com essas linhas na memória tenho que imprimir na tela só que com 5 threads.

Fiz um exemplo para melhor entendimento do problema:

class TestThread{
   
   public void execute(){

     //Objeto que serve de interface com o banco de dados 
     ObejtoDAO dao = new ObjetoDAO() ;
     
     //Pega o total de linhas que existem na tabela
     int total = dao.total(); 
      
     int limit = 10;

     for(int i = 0; i < total; i++){
         
         //Retorna as linhas do banco
         int offset = i;
        ArrayList arrayList = dao.getRows(limit, offset);

        //Nesta classe generica está o método (run) que eu quero executar, que no caso é imprimir um texto na tela
        ThreadGenerica test = new ThreadGenerica();
        ThreadGenerica test1 = new ThreadGenerica();

        for(int j = 0; j < arrayList.size(); j++){
             test.start()
             test1.start();
        }
     }
   }
}

Sempre quando executo o código dá esta exception:

Esta lógica está certa?
Desde já agradeço a ajuda de todos!!!

Você não pode chamar o método start() mais de uma vez.

Experimente trocar:

[code] ThreadGenerica test = new ThreadGenerica();
ThreadGenerica test1 = new ThreadGenerica();

    for(int j = 0; j &lt; arrayList.size(); j++){   
         test.start()   
         test1.start();   
    }   [/code]

Por:

for(int j = 0; j &lt; arrayList.size(); j++){ ThreadGenerica test = new ThreadGenerica(); test.start() }

PS: Para que vc precisa de tantas threads?

Mas ai quando o “for” continuar o programa não vai ficar criando várias trheads?
Esse print depois vai virar uma url que irá fazer vários request a vários pcs, com isso eu aumento a velocidade do programa…

Para que você criou o for, em primeiro lugar?

O primeiro for é para pegar aos poucos os dados do banco e o segundo é para fazer request com estes dados que eu recuperei do banco. Que no meu caso eu gostaria de fazer este request 5 em 5.

Por exemplo recuperei no total 50 linhas.
Pego 5 llinhas monto as querys com os dados da mesma e faço 5 requests.

Você então pega poucos dados e dispara 5 threads para trata-los, é isso?
E depois pega mais uns poucos e dispara mais 5 threads?

É claro que o for que eu te indiquei dispara várias threads, mas me parece que é exatamente isso que vc quer fazer, não é?

Isso mesmo…
Mas neste for que vc indicou não vai ficar craindo muita thread? por exemplo tenho um for de 100, não vai ser criado 100 threads?

Bom, é melhor você repensar a lógica.

O seu DAO está lendo o banco todo. Pense numa lógica, primeiro, para dividir esse banco todo em N partes iguais (provavelmente, gerando N listas de igual tamanho).

Vai ter que mudar aquele for ali, que está indo de linha em linha. Já que vc vai trabalhar de “grupos de linhas” em “grupos de linhas”.

Depois, monte um Runnable para trabalhar um desses grupos de linhas. Então, altere seu código para disparar esses Runnables de 5 em 5 (nem que ainda não seja em paralelo).

Finalmente, adicione as threads, que executam seu Runnable em paralelo, e a sincronização necessária (provavelmente só um join() será suficiente).

Depois de tudo isso, você ainda pode otimizar o código usando um ExecutorService ao invés de criar as threads com new, isso fará um Pool de threads, permitindo que você “reproveite threads” e garantindo que várias threads não sejam criadas e destruídas. Por isso, recomendo que você implemente Runnable ao invés de extender thread.

Eu tentei várias coisa para não ter que ler o banco todo e nem ir 2x no mesmo, mas por falta de tempo acabei usando esta lógica mesmo, vc teria alguma sugestão para dividir o banco em N partes sem ter quer lê-lo todo?

E quanto as threas vou seguir o seu conselho, mas vou ter que dar uma estudada para poder impementar desta maneira, vc poderia indicar por onde posso começar?

Muito obrigado pelas ajudas!!!

Deixe a leitura do banco em um passo só mesmo. Divida o que foi lido.
Como não são várias máquinas que vão ler do banco, não há ganho significativo.

Agora, você deve criar listas menores para que suas threads processem.

Isso tornará o acesso as listas “thread-safe” (já que cada thread terá a sua própria lista). Se você mantiver uma lista só, e fazer todas as threads percorrerem a mesma lista, terá que se incomodar com sincronização.