Paralelizacao de procedures via Thread

4 respostas
G

Ola pessoal,
tenho um caso para resolver, e ja fiz um rascunho, mas gostaria de algumas opinioes.

Tenho uma situacao em que tenho que paralelizar a execucao de duas procedures, e apos a execucao de ambas, faco o commit ou o rollback. Abrirei duas conexoes para cada thread, e mandarei executar as procedures.
O responsavel pela chamada dessas threads sera outra thread que sera executada de 5 em 5 minutos. Pensei em usar o wait nas duas threads, e quando terminarem, mandarem o notify cada um, para que a thread chamadora saiba que o processamento terminou, e faca o commit caso as duas terminem sem exceptions ou rollback caso alguma termine em problema.
Alguem poderia me dar uma dica de como resolver esta tarefa?
Grato a todos

4 Respostas

G

Fiz uma pesquisa, e pensei em utilizar a classe CountDownLatch, conforme http://programmingexamples.wikidot.com/countdownlatch

G

Vejam uma solucao.

package paralelizar.procedure;

import java.util.concurrent.CountDownLatch;

public class Chamador {

	private static final int COUNT = 9;

	public static void main(String args[]) {
		// CountDownLatch(int count)
		// Constructs a CountDownLatch initialized with the given count.
		CountDownLatch startSignal = new CountDownLatch(1);
		CountDownLatch stopSignal = new CountDownLatch(2);
			new Thread(new Procedure(startSignal, stopSignal,"mensal")).start();
			new Thread(new Procedure(startSignal, stopSignal,"semestral")).start();
		System.out.println("Go");
		startSignal.countDown();
		try {
			stopSignal.await();
		} catch (InterruptedException ex) {
			ex.printStackTrace();
		}
		System.out.println("Done");
	}
}
package paralelizar.procedure;

import java.util.concurrent.CountDownLatch;

public class Procedure implements Runnable{

	CountDownLatch startLatch;
	 
    CountDownLatch stopLatch;

    String procedure;
    
	@Override
	public void run() {
		try
        {
            startLatch.await(); // wait until the latch has counted down to
                                // zero
        } catch (InterruptedException ex)
        {
            ex.printStackTrace();
        }
        System.out.println("Exeutando procedure: " + procedure);
        for(int i = 0 ; i < 100 ; i++){
		}
        stopLatch.countDown();
	}
	
	Procedure(CountDownLatch startLatch, CountDownLatch stopLatch, String procedure)
    {
        this.startLatch = startLatch;
        this.stopLatch = stopLatch;
        this.procedure = procedure;
    }
}

O que acham?

soaresinfo

Eu não conheço esse framework. Tentaria o mais simples possível, ao invés da usar wait na thread principal, eu chamaria sleep e verificaria variaveis sinalizadoras de cada thread para dar commit ou rollback.

rmendes08

Cara, bastar chamar o método join para as threads:

void main(){
   Thread t1 = new Thread();
   Thread t2 = new Thread();

   t1.start()
   t2.start();

   t1.join();
   t2.join();

   commit();
}

De qualquer maneira, você pode ter muitos problemas em utilizar a mesma transação em mais de uma thread. Como você pode abrir diversos cursores no BD, pode ser que uma thread não enxergue as modificações de outra thread, além disso, o próprio BD pode travar uma ou mais tabelas, fazendo que uma das threas fique ociosa boa parte do tempo. No fim das contas, o “ganho” de processamento seria todo perdido nesses gargalos.

Na boa, reflita bem se essa procedures realmente precisam ser executadas em paralelo ou se é muita vontade usar threas porque são legais. No caso de realmente precisarem ser paralelas, muito provavelmente elas não precisam compartilhar a mesma transação.

Criado 11 de agosto de 2011
Ultima resposta 12 de ago. de 2011
Respostas 4
Participantes 3