由于这是我的第一篇文章,我很抱歉任何错误的结构。我正在开发一个个人项目,这是一个用java制作的时钟,用于显示时间/日期/时间,每个季度播放一个音频文件以及每小时钟声。 GUI是用摆动项目构建的。等待()和通知()与linelistener
当时钟达到一定时间时,它必须发出声音/播放声音,我希望在时钟发出声音时在GUI上显示图标。此刻,该图标在方法开始时切换并在结束时再次切换。我想方法等待()而音频正在播放之前,第二次切换图标。 (也许有更好的方法来做到这一点。)
我初出茅庐用java我觉得如果我使用的wait()和通知()不正确。我已经看过例子,直到我的脑袋旋转,我仍然不确定我需要的解决方案。
我使用LineListener以通知剪辑播放完毕,并可以进行切换的图标。
这是打风铃方法:
public void play() throws InterruptedException {
while (mute == false) {
synchronized (chimeLock) {
ChimeClockGUI.toggleChimeIcon();
clip.start();
do {
chimeLock.wait();
} while (clip.isActive());
ChimeClockGUI.toggleChimeIcon();
}
}
}
而且
public void toll() throws InterruptedException {
if (mute == false) {
synchronized (chimeLock) {
ChimeClockGUI.toggleChimeIcon();
ONTHEHOUR.clip.start();
do {
chimeLock.wait();
} while (ONTHEHOUR.clip.isActive());
if (Calendar.getInstance().get(Calendar.HOUR) == 0) {
clip.loop(11);
do {
chimeLock.wait();
} while (clip.isActive());
} else if (Calendar.getInstance().get(Calendar.HOUR) == 1) {
clip.start();
do {
chimeLock.wait();
} while (clip.isActive());
} else {
clip.loop(Calendar.getInstance().get(Calendar.HOUR) - 1);
do {
chimeLock.wait();
} while (clip.isActive());
}
ChimeClockGUI.toggleChimeIcon();
}
}
}
最后,更新()从LineListener方法:
@Override
public void update(LineEvent le) {
synchronized (chimeLock) {
LineEvent.Type type = le.getType();
if (type == LineEvent.Type.OPEN) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Timestamp(System.currentTimeMillis())) + ": Clip opened...");
} else if (type == LineEvent.Type.CLOSE) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Timestamp(System.currentTimeMillis())) + ": Clip closed...");
chimeLock.notifyAll();
} else if (type == LineEvent.Type.START) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Timestamp(System.currentTimeMillis())) + ": Clip started...");
} else if (type == LineEvent.Type.STOP) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Timestamp(System.currentTimeMillis())) + ": Clip stopped...");
chimeLock.notifyAll();
}
}
}
我包括请拨打播放的方法()和收费()。
chimeService.scheduleAtFixedRate(() -> {
try {
ChimeClockSound.TOLL.toll();
} catch (InterruptedException ex) {
Logger.getLogger(ChimeClockGUI.class.getName())
.log(Level.SEVERE, null, ex);
}
任何帮助或建议将不胜感激。谢谢!
注意'synchronized'函数阻止当前(this)对象,并且没有任何其他线程可以访问它。如果对象/类与你的GUI相关,不建议锁定'this',只需要一个'object'。 – 2017-07-06 20:26:47
在这种情况下'play()'和'toll()'只能从一个'ScheduledExecutor'线程调用。 – cbs6f