Como aguardar a execução de um método

Eu gostaria de saber se é possível criar algo semelhante a uma thread, porém com um método. Bom, eu nunca cheguei a mexer com threads, mesmo sabendo do que se trata, e agora me deparei com um problema de thread e não sei como resolver.

Meu problema é que eu tenho um método chamado “buildDadosPrecoJusto()”, esse método vai fazer algumas requisições ao banco e carregar algumas imagens, a quantidade pode variar dependendo do número de cadastros. Eu preciso esperar esse método terminar de executar para então continuar o programa.

Pesquisando eu encontrei os métodos para mexer com threads: wait() e join(), mas pelo que notei ambos só trabalham com objetos.

O método é muito grande, por isso acho que não vale apena postar, mas seria mais ou menos assim:

public class MinhaClasse {
    main() {
        buildDadosPrecoJusto();
    }

    private void buildDadosPrecoJusto() {
        // Minha query que busca as imagens
        List<MetodoAvaliacaoPrecoJusto> precoJustoList = new JPAQuery<MetodoAvaliacaoPrecoJusto>(jpaApi.em()).from(QMetodoAvaliacaoPrecoJusto.metodoAvaliacaoPrecoJusto)
                .where(QMetodoAvaliacaoPrecoJusto.metodoAvaliacaoPrecoJusto.avaliacao().id.eq(avaliacao.getId()))
                .fetch();
        for (MetodoAvaliacaoPrecoJusto precoJusto : precoJustoList) {
            try {
                // Pego as imagens
            } catch(Exception e) {
                throw new ApplicationException("Internal Error");
            }
        }
}

Dês de já, agradeço.

Vou deixar aqui um material de apoio que eu acho bem legal para trabalhar com processamento de dados de forma assíncrona, dá uma olhada, acredito que o uso de Future atenda o que você precisa.

https://www.devmedia.com.br/processamento-assincrono-em-java-com-future-e-futuretask/33851

1 curtida

Eu dei uma olhada no link que você mandou, mas sabe me dizer se também funciona com métodos void? Pelo que eu vi, ali trabalhava com classes, mas eu preciso de algo para trabalhar com métodos. Eu acabei esquecendo de mencionar que o método “buildDadosPrecoJusto()” não possui retorno, mas já corrigi a questão.

Esse método roda em outro thread? Ou quer fazer isso?

Então, aí que tá. Eu não fiz para esse método ser uma thread, mas ele parece estar agindo como uma. Eu estou mexendo com o Apache POI e estou criando um relatório, quero colocar o número de páginas em um parágrafo no documento, porém conforme eu vou adicionando as imagens no documento o número de páginas aumenta também, por isso eu preciso esperar ele adicionar todas as imagens ao documento e depois adicionar o número de páginas, o problema é que o número de páginas está vindo errado. Estou olhando agora aqui o programa pra ver se não foi um erro de código ou coisa do tipo.

De qual biblioteca é essa classe? Qual pacote?

QueryDSL, aqui os import:
import com.querydsl.jpa.impl.JPAQuery;
import play.db.jpa.JPAApi;

Você não está usando Threads, a biblioteca aparentemente não tbm (teria tomado uma exception no for se a API estivesse mexendo com a lista, enquanto iterava).

Então essa inconsistência deve estar vindo de outro lugar.

Você tem razão, encontrei o erro na própria API do POI. Na verdade não é um erro da API, foi mais uma ignorância minha por não ter notado que o word não guarda o número de páginas no documento. O comando que eu estava utilizando basicamente calculava quantas páginas daria o documento baseando-se no tamanho das fontes e etc. porém as imagens não são consideradas nesse cálculo (provavelmente por ter tamanhos variados). Desculpe pelo transtorno.

1 curtida

Implementa um Listener (também chamado de Observer), quando seu método terminar a execução você notifica os listeners dele.