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

Como finalizar uma Thread

Tenho um botão que, ao ser clicado, cria uma Thread responsável por executar uma música (arquivo mp3), e tenho também um item num menu que abre um JFileChooser para que se possa abrir outra música.

Preciso que quando eu escolher o outro arquivo de áudio, a música (ou a Thread) que está atualmente em execução seja finalizada para que o novo arquivo de áudio seja executado. Em outras palavras, quero que a Thread atual seja encerrada, e uma nova Thread com o novo arquivo mp3 seja criada e inicializada.

Porém não encontro solução. Os métodos .stop() e .destroy() estão depreciados, e .interrupt() não funciona.

O que devo fazer para encerrar esta Thread?

O código é bem simples. Este é o código que o botão deve executar.

private void botao_playActionPerformed(java.awt.event.ActionEvent evt) {                                           
          TocaAudio ta = new TocaAudio("arquivo mp3");
          Thread faixaAtual = new Thread(ta);
          faixaAtual.start();
    }

E este o que o menuItem executa:

private void item_abrirActionPerformed(java.awt.event.ActionEvent evt) {                                           
        JFileChooser escolheArquivo = new JFileChooser();
        FileNameExtensionFilter filtro = new FileNameExtensionFilter("Áudio no formato MP3", "mp3");
        escolheArquivo.setFileFilter(filtro);
        escolheArquivo.setAcceptAllFileFilterUsed(false);
        escolheArquivo.showOpenDialog(null);

        //TODO --- Finalizar a Thread atualmente em execução.

        TocaAudio faixaSelecionada = new TocaAudio(escolheArquivo.getSelectedFile().getAbsolutePath().toString());
        Thread tt = new Thread(faixaSelecionada);
        tt.start();
    }

O código de TocaAudio:

public class TocaAudio implements Runnable{

    private String arq_musica;

    public TocaAudio(String caminho){
        this.arq_musica = caminho;
    }

    @Override
    public void run() {
        try{
            TocadorMidia t = new TocadorMidia();
            Player p = t.tocar(arq_musica);
            p.play();
        }catch(JavaLayerException e){
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }
}

Nova TocaAudio:

package santos.flavio.player;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class TocaAudio implements Runnable{

    //Campos...
    private String arq_musica;
    private boolean Iniciada;
    private Thread seg1;
    private Player pl;

    //Construtores...
    public TocaAudio(String caminhoArquivo, String nomeThread){
        new TocaAudio(caminhoArquivo, nomeThread, true);
    }

    public TocaAudio(String caminhoArquivo, String nomeThread, boolean playThread){
        this.arq_musica = caminhoArquivo;
        this.Iniciada = playThread;
        seg1 = new Thread(this);
        seg1.setName(nomeThread);
        if(playThread)
            seg1.start();
    }

    //Getter e Setters...
    public boolean isIniciada() {
        return Iniciada;
    }

    public void setIniciada(boolean isIniciada) {
        this.Iniciada = isIniciada;
    }

    //Métodos...
    public void inicializarThread(){
        if(!(this.seg1.isAlive()))
            this.seg1.start();
        else
            System.err.println("Este segmento já se encontra inicializado");
    }

    public void encerrar(){
        pl.close();
    }

    public Player executar(){
        TocadorMidia t = new TocadorMidia();
        return t.tocar(arq_musica);
    }

    @Override
    public void run() {
        try{
            pl = executar();
            pl.play();
            System.err.println("Método .play() executado...");

        }catch(JavaLayerException e){
            return;
        }
    }
}
  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.