我怎样才能毫无例外地中断这个警报?
Posted
技术标签:
【中文标题】我怎样才能毫无例外地中断这个警报?【英文标题】:How can I interrupt this alarm without exceptions? 【发布时间】:2011-07-22 16:42:52 【问题描述】:我有一个闹钟,它会在特定时间播放声音。我正在寻找一种方法来阻止它运行,我该怎么做?
这是我的闹钟代码:
waiter = new Thread(new Runnable()
public void run()
while (Thread.currentThread() == waiter)
Calendar d = Calendar.getInstance();
if (getAlarmHours() == d.get(Calendar.HOUR_OF_DAY))
if (getAlarmMinutes() == d.get(Calendar.MINUTE))
UserInterface
.setAlarmText("no alarms");
playSound.play();
isSoundPlaying = true;
break;
);
我想再次使用闹钟,如果我能提供任何关于我可能出错的地方的建议,我将不胜感激。如果我使用wait()
,我怎样才能在没有异常的情况下通知?
【问题讨论】:
这段代码在触发前会消耗 100% 的 cpu。我建议您在两次检查之间至少睡一秒钟。 你是对的,谢谢..每当我运行程序时,我的电脑开始滞后..再次感谢!我现在做一些改变 你应该看看你的while循环中的条件。启动线程后,它可能永远不会结束。顺便说一句:我从未见过这种构造,也不知道它在运行时的行为。 我几乎删除了这个问题。请记下我的编辑。通过在 Stack Overflow 上提问,您正在向比您有更多经验的同行寻求帮助。尽量大写应该是的单词,同时避免像“想要”这样的“文字说话”。像对待专业人士一样对待我们,您会得到专业人士的答案。 【参考方案1】:waiter.interrupt();
另外,在你的 while 循环中,可以放一个 Thread.sleep(100);
【讨论】:
【参考方案2】:我写了一些虚构的代码,应该会有所帮助。 code 如果您愿意,您可以修改解决方案以使其看起来像您的程序
【讨论】:
您的boolean
标志必须是volatile
。话虽如此,为什么不直接使用while(!Thread.currentThread().isInterrupted())
作为循环条件,当你想终止线程时,发出interrupt()
?【参考方案3】:
考虑将代码从一段时间移动到某种形式的计时器。
一些常见的建议是在 JVM 中构建 Timer 类或 Quartz 这是 Terracotta 的第 3 方库。
使用标准JVM选项的警报问题
Timer timer = new Timer();
//Start the alarm now, change the date object to your specific time
timer.schedule(new AlarmTimerTask(), new Date(System.currentTimeMillis()));
你的 AlarmTimerTask 类将是
public class AlarmTimerTask extends TimerTask
public void run()
//Do something
如果您在任何时候想要删除计时器(将其关闭或应用程序正在关闭),请致电 timer.cancel()
以删除任务。
Quartz将为您提供添加的功能和良好的库来学习
编辑:我应该指出,如果您将 AlarmTimerTask 类分配给它自己的变量,而不是在 schedule() 方法中对其进行初始化,您也可以在单个任务上调用 cancel(),而不仅仅是 Timer
【讨论】:
听起来很有趣,我想我会用它,听起来更容易......谢谢男人以上是关于我怎样才能毫无例外地中断这个警报?的主要内容,如果未能解决你的问题,请参考以下文章
我怎样才能让 2 个 wavefilereader 依次播放?