Ajuda Thread

2 respostas
J

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!!!

2 Respostas

H

Amigo, eu não entendi muito bem o seu problema não…
Fiquei meio em dúvida quanto ao código também.

Mas se a Thread é só pra vc ver que tudo pode sair em ordem aleatória,
tente guardar todos os dados que você resgata do banco em um Vetor ou ArrayList e com uma variável com o tamanho desse vetor ou um contador com o tamando do vetor sendo seu limite.

Faça com que esse vetor e essa variável sejam static, para você poder acessá-las pela classe que vai executar a Thread.
Crie então as cinco Threads.

Tenha em mente, que a cada impressão, você deve incrementar o contador (fazer a verificação de que ainda existe objetos no vetor).
Assim, cada Thread sua vai pegar uma única posição do vetor…

Eu vou tentar fazer um exemplo aqui e posto daqui a pouco…
Abraço!!

H

OLha, eu fiz o seguinte…povoei com Strings um ArrayList
Cada uma das 5 Threads vai imprimir todos os valores do ArrayList.

Note, que eu usei um Thread.sleep(Math.random());. Usei, pra deixar cada Thread rodar com um tempo sorteado de espera, mas você pode tirar esse trecho e ver que cada vez que executa ele roda de forma diferente de acordo com o escalonador do SO.

Espero que seja mais ou menos essa a sua dúvida e que eu tenha ajudado a solucionar.

import java.util.ArrayList;

public class ThreadTest {

	static ArrayList <String> meuArray = new ArrayList<String>();
	static int tamArray=0;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		meuArray.add("A");
		meuArray.add("B");
		meuArray.add("C");
		meuArray.add("D");
		meuArray.add("E");
		meuArray.add("F");
		meuArray.add("G");
		meuArray.add("H");
		meuArray.add("I");
		
		tamArray = meuArray.size();
		
		System.out.println("Tamanho do array = "+tamArray);
		
		minhaThread t1 = new minhaThread("Thread 1");
		minhaThread t2 = new minhaThread("Thread 2");
		minhaThread t3 = new minhaThread("Thread 3");
		minhaThread t4 = new minhaThread("Thread 4");
		minhaThread t5 = new minhaThread("Thread 5");
	
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();		
	}
}

class minhaThread extends Thread{
	String nome;
	int contador=0;
	public minhaThread(String nome) {
		this.nome=nome;
	}
	
	public void run() {
		
		while(contador<ThreadTest.tamArray){
			
			System.out.println(nome +"  -- Imprimindo = "+(String)ThreadTest.meuArray.get(contador));
						
			try {
				Thread.sleep((long) Math.random());
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			contador++;
		}
	}
	
}
Criado 25 de janeiro de 2008
Ultima resposta 25 de jan. de 2008
Respostas 2
Participantes 2