Programa não termina a execução

Olá pessoal,

Estou estudando Java com o livro Use a Cabeça Java, cheguei no capítulo onde é criado o “vídeo musical”.
Testei o código abaixo, que aparece no capítulo, e notei que o programa não encerra, então tentei exibir uma mensagem no fim do programa, porém esta mensagem está aparecendo antes da execução do método go(), então gostaria de ajuda para entender o que está acontecendo.

import javax.sound.midi.*;

public class MiniMusicPlayer2 implements ControllerEventListener {

	public static void main(String[] args) {
		MiniMusicPlayer2 mini = new MiniMusicPlayer2();
		mini.go();
		System.out.println("terminou");
	}
	
	public void go() {
		
		try {
			Sequencer sequencer = MidiSystem.getSequencer();
			sequencer.open();
			
			int[] eventsIWant = {127};
			sequencer.addControllerEventListener(this, eventsIWant);
			
			Sequence seq = new Sequence(Sequence.PPQ, 4);
			Track track = seq.createTrack();
			
			for(int i = 5; i < 60; i += 4) {
				track.add(makeEvent(144, 1, i, 100, i));
				track.add(makeEvent(176, 1, 127, 0, i));
				track.add(makeEvent(128, 1, i, 100, i + 2));
			}
			
			sequencer.setSequence(seq);
			sequencer.setTempoInBPM(220);
			sequencer.start();
		} catch(Exception ex) {
			ex.printStackTrace();
		}
	}
	
	public void controlChange(ShortMessage event) {
		System.out.println("1a");
	}
	
	public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
		MidiEvent event = null;
		try {
			ShortMessage a = new ShortMessage();
			a.setMessage(comd, chan, one, two);
			event = new MidiEvent(a, tick);
		} catch(Exception e) {
			e.printStackTrace();
		}
		return event;
	}	
}

Obrigado…

Cara, particularmente n conheco essas libs q vc está usando, mas executando aki percebi q essa variavel "eventsIWant " eh uma especie de contador, e q o listener executa o codigo em função dessa quantidade. E se tu kizer parar a execução eh so diminuir o valor desse cara ou entao logo apos o start usar o close.

hoho

[quote=jaera_]Cara, particularmente n conheco essas libs q vc está usando, mas executando aki percebi q essa variavel "eventsIWant " eh uma especie de contador, e q o listener executa o codigo em função dessa quantidade. E se tu kizer parar a execução eh so diminuir o valor desse cara ou entao logo apos o start usar o close.

hoho[/quote]

Olá,

Mesmo diminuindo o tamanho de eventsIWant ou colocando o close (também tentei stop) após o sequencer.start() o programa continua sem terminar a execução. O que estou mais curioso em saber é por que a mensagem “terminou” aparece antes do resultado da execução do método go(), visto que a mensagem deveria aparecer depois.

obrigado…