我怎样才能毫无例外地中断这个警报?

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 依次播放?

在另一个线程中中断 pySerial readline

在应用程序购买警报显示时,iOS 9 的 XPC 连接中断

STM32外部中断用一根中断线怎样配置两个中断口,优先级设置

Arduino如何处理中断?