1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problemas com final da Thread

Galera,

Minha aplicação busca em um servidor via HTTP um lista de imagens.

Dependendo da situação não esta terminando as lista de Thread, fazendo com o processo java fique ocupando 100% de CPU.

O que pode ser? Onde estou errando? Esta faltando alguma coisa?

Abaixo os meus códigos:

 public static final int CORE_POOL_SIZE = 50;
 public static final int MAX_POOL_SIZE = 80;
 public static final long KEEP_ALIVE_TIME = 5000;

 public void carregarImagens(List<Imagem> lista) {
        try {
            ThreadPoolExecutor service = new ThreadPoolExecutor(Constantes.CORE_POOL_SIZE, Constantes.MAX_POOL_SIZE, Constantes.KEEP_ALIVE_TIME, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
            for (Imagem imagem : lista) {
                service.execute(new ProcessaImagem(imagem));
            }
            service.shutdown();
            // Wait until all threads are finish
            service.awaitTermination(1, TimeUnit.NANOSECONDS);

            while (!service.isTerminated()) {
            }
            Logger.getLogger(CargaInicialBean.class.getName()).log(Level.SEVERE, "FIM DO METODO CARREGAR IMAGENS DA CLASSE SCHEDULE");

        } catch (Exception ex) {
            Logger.getLogger(CargaInicialBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Classe que processa as imagens

public class ProcessaImagem implements Runnable {

    private final Imagem imagem;

    public ProcessaImagem(Imagem imagem) {
        this.imagem = imagem;
    }

    private void salvarImagensNoDisco() throws Exception {
        try {
            URL url = new URL(imagem.getUrlExterna());
            BufferedImage img = ImageIO.read(url);
            File diretorio = new File(imagem.getDiretorioInterno());
            String extensao = imagem.getDiretorioInterno().split("\\.")[1];
            ImageIO.write(img, extensao, diretorio);
        } catch (IOException e) {
            throw new Exception(e);
        }
    }

    @Override
    public void run() {
        try {
            salvarImagensNoDisco();
        } catch (Exception e) {
             Logger.getLogger(ProcessaImagem.class.getName()).log(Level.SEVERE, null,e);
        }
    }

}
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java threads ou faça a sua própria pergunta.