Rapaziada deixa eu tentar explicar pra vcs oq ta pegando… não conheço quase nada de thread… só q estou tendo que dar manutenção em um processo aqui…
todos os usuarios da produção … quando clicam pra fazer um um processo do sistema aqui… e acionada uma thread…eles clicam toda hora… varias vezes no dia…
e como era um processo lento… colocamos em uma thread, para que o sistema não fique travado rodando o processo…
quando o usuario clica no botão é chamado este método
código abaixo
/**
* Metodo que chama a thread de sincronizacao
* @param ids
*/
private void threadSynchronize(List<Long> ids) {
ThreadBuilder threadBuilder = new ThreadBuilder();
threadBuilder.withSynchronizeCampaign(synchronizeCampaign);
Thread thread = new Thread(threadBuilder);
thread.start();
}
depois que eu dou start() ele vai pra esse codigo
private synchronized void threadSynchronize(){
BidLog.debug("Chamando thread de sincronizacao");
int cont = 0;
for (Long id : ids) {
cont++;
BidLog.debug("Campanha: " + cont);
synchronizeCampaign.execSynch(id);
}
BidLog.debug("Fim da execução da thread!");
}
este método - > synchronizeCampaign.execSynch(id)
abaixo
public synchronized void execSynch(Long campaignID) {
Campaign campaign = campaignListDAO.get(Campaign.class, campaignID);
if (campaign.getTries() == -2) {
setUpSponsorById(campaignID);
submitCampaign(campaign);
if(campaign.getId() == campaignID){
message = getErrors(campaignID);
if (message == null || message.equals(""))
message = "Campanha " + campaign.getName() + " Sincronizada com Sucesso!";
}else
message = "Essa campanha não pôde ser sincronizada.Tente mais tarde.";
campaign.setTries(getStatusSincronizeBD(campaignID));
System.out.println("Tamanho da mensagem - > " + message.length());
campaign.setMessage(message.substring(1,5));
campaignListDAO.update(campaign);
System.out.println("Campanha gravada");
message = null;
}
}
quando está rodando este método … as vezes pode causar exceções … não tem problema … pode dar mesmo…
onde eu trato essas exceções??? …
cada usuario que clica pra fazer essa sincronização… as threads ficam na fila ou pilha nao sei rsrsr … por causa do synchronized …cada uma espera a outra terminar né??
pra depois começar outra thread rodar…
só q se a primeira thread que o usuario “A” clicou pra fazer o processo da exceções… parece que ela não termina de executar, ele não printa o codigo “BidLog.debug(“Fim da execução da thread!”);” que está no método la em cima… ela pára no meio do caminho parece…
e a thread do usuario “B” que estava aguardando o processo da “A” terminar … começa a rodar a thread dele …
mas com o tempo começa a ficar lento até estourar a memória… pq é um processo muito demorado…
quando não dá exceções todas as threads conseguem terminar sem ficar lenta…