Post on 16-Mar-2021
Multithreading e JavaEE
QConSP '14
Gilliard Cordeiro, tomador de tereré
Ok, agora vamos ao que interessa…
Por que um sistema pode ficar lento?
E como vc pensa em resolver?
pense melhor
Pode ser bom… …pode ser Pepsi
Simples :)
pouca mudança no código e muita nos
resultados
com Multithreading
Contrato
- cliente - saldo
Parcela
- vencimento - valor
* parcelas
!! public Double reajustaContrato(Contrato contrato, double percent){ contrato.saldo *= (1 + percent); return contrato.saldo; }!
import java.util.concurrent.Future; import javax.ejb.AsyncResult; ! @Asynchronous public Future<Double> reajustaContrato(Contrato contrato, double percent){! contrato.saldo *= (1 + percent); return new AsyncResult<Double>(contrato.saldo); }
! @Asynchronous public Future<Double> reajustaContrato(Contrato contrato, double percent){! contrato.saldo *= (1 + percent) return new AsyncResult<Double>(contrato.saldo); }!
@EJB ContratoBean contratoBean void reajustarTodasContratos(double percentual){ List<Contrato> contratos = em.createQuery(“select…”).getResultList(); for(Contrato contrato : contratos){ contratoBean.reajustarContrato(contrato, percentual); } }
0
10
20
30
40
Local Server
78
32
18
SYNC ASYNC
Mas eu queria abrir uma Thread…
@Resource private ManagedExecutorService executor; void reajustaContratos(){ executor.execute(new Calculadora(contrato, 0.1)); } //——————————————————————————————————————————————-! class Calculadora implements Runnable{ Contrato contrato; double percentual;! public void run() { contrato.reajuste(percentual); } }
@Resource private ManagedExecutorService executor; double reajustaContratos(){ Future<Double> reajusteFuture = executor .submit(new Calculadora(contrato, 0.1)); return reajusteFuture.get() } //——————————————————————————————————————————————-! class Calculadora implements Callable<Double>{ Contrato contrato; double percentual;! public Double call() { return contrato.reajuste(percentual); } }
DEMO
http://gilliard.eti.br
Duvidas?
gscordeiro@gmail.com