我有一个小程序,它使用 JFugue API 创建音乐并为用户播放。它允许用户输入乐曲所基于的乐句,或者让他们选择随机生成乐句。我一直在使用以下方法(成功)来简单地停止和启动音乐,它使用 JFugue 的 Player 类在线程中运行。
我使用我的类和来自小程序 GUI 的用户输入生成音乐......然后......
private playerThread pthread;
private Thread threadPlyr;
private Player player;
(from variables declaration)
public void startMusic(Pattern p) // pattern is a JFugue object which holds the generated music
{
if (pthread == null)
{ pthread = new playerThread(); }
else
{
pthread = null;
pthread = new playerThread();
}
if (threadPlyr == null)
{ threadPlyr = new Thread(pthread); }
else
{
threadPlyr = null;
threadPlyr = new Thread(pthread);
}
pthread.setPattern(p);
threadPlyr.start();
}
class playerThread implements Runnable // plays midi using jfugue Player
{
private Pattern pt;
public void setPattern(Pattern p)
{
pt = p;
}
@Override
public void run()
{
try
{
player.play(pt); // takes a couple mins or more to execute
resetGUI();
}
catch (Exception exception)
{
}
}
}
当 Player.isPlaying() 为真时,当用户按下停止/开始按钮时,以下内容将停止音乐:
public void stopMusic()
{
threadPlyr.interrupt();
threadPlyr = null;
pthread = null;
player.stop();
}
现在我想实现一个功能,允许用户在播放音乐时更改参数,创建一个更新的音乐模式,然后播放那个模式。基本上,这个想法是让它为用户模拟对生成的音乐的“实时”调整。
好吧,我已经为此苦苦挣扎了几个星期。我已经阅读了所有标准的 java 文档,研究、阅读和搜索了论坛,并且尝试了许多不同的想法,但都没有成功。
我尝试过的所有方法都遇到的问题是,当我使用新的、更新的音乐模式启动新线程时,所有旧线程也会启动,并且会出现无法理解的杂音而不是我想要的输出.
从我收集到的信息来看,问题似乎是我遇到的所有方法都要求线程能够定期检查“标志”变量的值,然后从其“运行”块中自行关闭响应该变量。但是,由于我的线程调用最少需要几分钟才能执行(播放音乐),并且我需要在它执行时终止它,所以确实没有安全的方法可以这样做。
所以,我想知道在线程方面我是否缺少一些东西,或者我是否可以使用完全不同的方法来实现我的目标。非常感谢任何想法或指导!谢谢!