【问题标题】: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 上提问,您正在向比您有更多经验的同行寻求帮助。尽量大写应该是的单词,同时避免像“想要”这样的“文字说话”。像对待专业人士一样对待我们,您会得到专业人士的答案。

标签: java multithreading timer alarm


【解决方案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

    【讨论】:

    • 听起来很有趣,我想我会用它,听起来更容易......谢谢男人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多