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
packageparalelizar.procedure;importjava.util.concurrent.CountDownLatch;publicclassChamador{privatestaticfinalintCOUNT=9;publicstaticvoidmain(Stringargs[]){// CountDownLatch(int count)// Constructs a CountDownLatch initialized with the given count.CountDownLatchstartSignal=newCountDownLatch(1);CountDownLatchstopSignal=newCountDownLatch(2);newThread(newProcedure(startSignal,stopSignal,"mensal")).start();newThread(newProcedure(startSignal,stopSignal,"semestral")).start();System.out.println("Go");startSignal.countDown();try{stopSignal.await();}catch(InterruptedExceptionex){ex.printStackTrace();}System.out.println("Done");}}
packageparalelizar.procedure;importjava.util.concurrent.CountDownLatch;publicclassProcedureimplementsRunnable{CountDownLatchstartLatch;CountDownLatchstopLatch;Stringprocedure;@Overridepublicvoidrun(){try{startLatch.await();// wait until the latch has counted down to// zero}catch(InterruptedExceptionex){ex.printStackTrace();}System.out.println("Exeutando procedure: "+procedure);for(inti=0;i<100;i++){}stopLatch.countDown();}Procedure(CountDownLatchstartLatch,CountDownLatchstopLatch,Stringprocedure){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:
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.