Problemas com Threads

6 respostas
Filipe_A

Estou com dificuldade de implementar uma thread aqui
será que alguem pode me ajudar?

Bem ...

deixa eu posta meu codigo:

public class ClassSound extends Observable implements Runnable {

....

    public ClassSound(Observer o) {

		addObserver(o);
	}

    .....

      public void run() {

         ....

         clip.start();

     }

}

Essa minha classe carrega e toca o som...

Agora minha outra:

public class ClassPanel extends JPanel implements Observer {

.....
        private ClassSound sound = new ClassSound(this);

        Thread processo;

        private void executarProcesso() {
		if (processo == null) {

			processo = new Thread(sound);
			processo.start();

		} else {
			System.out.println("O processo ainda está em execução");
            }

            public ClassPanel() {
       
            .......

              b1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				executarProcesso();

			}

		});

                 ....
        }

        .....


        @Override
	public void update(Observable arg0, Object arg1) {

		//processo = null;
		System.out.println("Acabou!!!!");

	}
}

Eu não to conseguindo parar o processo quando o som para de tocar...
Tentei varias coisa mas até agora não conseguir.

Tb não sei se vou ter a necessidade de usar o padrão observer ou soh o thread mesmo ...
Ou se os dois são usados juntos....

Espero a ajuda de vcs..

Obrigado.

6 Respostas

renzonuccitelli

Olha, se eu entendi bem, vc implementou o padrao Observer de forma que o método update seja chamado após o término do som. Acredito que o processo esteja parando sim, só que em nenhum momento vc chama o método do observador. Na sua classe Observable provavelmente deve ter um método como getObservers ou getObserverList, aí vc precisa pegar esses observadores, logo depois do clip.start() do seu método run da classe ClassSound e chamar o método update dessas interfaces, usando um for each, por exemplo. Tenta ai e depois fala se funcionou:

public class ClassSound extends Observable implements Runnable {

....

    public ClassSound(Observer o) {

		addObserver(o);
	}

    .....

      public void run() {

         ....

         clip.start();
         for(Observer o: this.getObserverList()){
                   o.update(this,o);
         }

     }

}
Filipe_A

Oi , Bom dia …

Então eu tentei aqui mas não funcionou acho que deve estar faltando alguma coisa.

minha classe esta assim:

public class ClassSound extends Observable implements Runnable {

	private Clip clip;
	private static final String LOCAL_SONS = "Extras/Sons/";
	private String[] colecao_sons = { "som_um", "som_dois" };
	private int posSound = 0;

	public void setPosSound(int i) {
		this.posSound += i;
	}

	public Clip getClip() {
		return this.clip;
	}

	public ClassSound(Observer o) {

		addObserver(o);
	}

	@Override
	public void run() {

		File soundFile = new File(LOCAL_SONS + colecao_sons[posSound] + ".wav");
		AudioInputStream sound = null;

		try {
			sound = AudioSystem.getAudioInputStream(soundFile);
		} catch (UnsupportedAudioFileException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		DataLine.Info info = new DataLine.Info(Clip.class, sound.getFormat());
		try {
			clip = (Clip) AudioSystem.getLine(info);
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		}

		try {
			clip.open(sound);
		} catch (LineUnavailableException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		clip.start();

		for (Observer o : this.getObserverList()) {
			o.update(this, o);
		}

	}

}

Ta acusando erro do metodo getObserverList() que não existe … e mesmo quando eu crio ele ainda assim
da um erro…

Tipo neste caso eu so vou adicionar um observers e deste jeito pelo que eu entendi
isto seria um ArrayList …acho que não precisaria ?

Obrigado.

renzonuccitelli

Bom, o padrao Observer preve que vc pode utilizar varios observadores, e como tinha o método addObserver, eu presumi que existisse um getObserver, ou getObserverList na sua classe Observable. Veja os método dessa classe e veja se tem algo do gênero na classe, ou caso realmente vc só esteja usando observador mesmo, deve ter um getObserver ou algo assim, aí basta vc chamar o update dele. Só coloquei o código pra vc ver que tem que chamar o método update. Em ultimo caso, vc poderia criar um atributo observer em sua classe e chamar o update do mesmo, passando a referencia para o atributo no construtor.

Filipe_A

Então antes eu ja tinha tentado algo assim

...
       
        clip.start();
       
        if(!clip.isRunning()) {
	       notifyObservers(new Boolean(true));   
                   setChanged();

       }

na na classe Observer

....

        public void update(Observable arg0, Object arg1) {

		if (((Boolean) arg1).booleanValue()) {
			processo = null;
		}

}

Mas não funcionava.

depois tentei outros metodos como hasChanged(), setChanged(), clearChanged() …
não consegui parar o processo e começar outro … pq na logica so começa outro processo se o processo for null.

....

if (processo == null) {

		processo = new Thread(sound);
		processo.start();

	} else {
		System.out.println("O processo ainda está em execução");
}

Então valeu pela ajuda vou continuar tentando aqui.
Se alguem tiver mais alguma sugestão eu agradeço.

Obrigado!

renzonuccitelli

Bom, tem que saber sobre essa classe clip tb. A forma que escrevi seria caso o método não execute uma Thread diferente. Caso clip.start() seja o inicio de outra Thread, a que vai rodar o clip, ai nao vai funcionar mesmo. Nessa caso, vc teria que sincronizar o método para esperar a Thread iniciada pelo clip acabar. Tb toma cuidado com esse processo=null, pq se vc estiver usando o mesmo como semaforo, vai ter que fazer isso sincronizadamente tb…

Filipe_A

Valeu Brigadão !

Parece ser um pouco complicado…

Vou procurar saber mais sobre a classe clip mas eu tenho quase certeza que ela executa uma thread tb…

vou pesquisar aqui e ver.

Abraço.

Criado 3 de abril de 2009
Ultima resposta 4 de abr. de 2009
Respostas 6
Participantes 2