【发布时间】:2016-03-13 20:34:11
【问题描述】:
我有一个线程在我的程序后台运行并检测截止日期(由用户在程序开始时输入设置)何时发生。我已经在while 循环中实现了这一点,并使用了sleep(1000) 方法。
一切正常,但我想将其从使用 sleep(1000) 更改为使用 wait() 和 notifyAll() 以与我的其余代码保持一致,并使警报实时发生而不是延迟半秒直到线程重新唤醒。
这是我目前拥有的
//Retrieve current date and time...
Calendar now = Calendar.getInstance();
//deadline not yet reached
while(now.before(deadline))
{
try
{
//wait a second and try again
sleep(1000);
}
catch (InterruptedException intEx)
{
//Do nothing.
}
//Update current date and time...
now = Calendar.getInstance();
//run loop again
}
////////////////////////////
///alert user of deadline///
////////////////////////////
我尝试将其更改为使用wait(),但没有成功。任何人都可以看到改变现有代码以实现我提到的方法的方法吗?
提前致谢, 标记
【问题讨论】:
-
notifyAll 在哪里被调用?你为什么不只睡你需要的秒数,而不是任意的 1000 秒?
-
notifyAll() 目前没有被调用,因为还没有 wait() 调用。目前它每秒钟检查一次,因为截止时间输入为一分钟,而我只是每秒检查一次。我想改用 wait() 以使其更准确@matt
-
wait 和 sleep 都使用 OS 来执行等待,一个并不比另一个更准确。事实上,等待不太准确,因为它可以令人惊讶地醒来,而睡眠则不会
-
顺便说一句,除非您知道可以安全地这样做,否则您不应忽略异常。你不应该犯这样的错误;我不知道如何处理异常,所以我会假装它没有发生。
-
Re,我想将它从使用 sleep(1000) 更改为使用 wait() 和 notifyAll() 为什么?
Thread.sleep(n)和o.wait(n)用于解决不同的问题。您可以使用 wait(n) 作为 sleep(n) 的替代品,但您唯一要做的就是迷惑、惹恼和疏远试图阅读您的代码的其他程序员。原因是,程序员希望函数的 name 告诉他们你想要完成的事情。如果他们看到wait(n),那么他们希望在某处找到notify()。但如果他们看到sleep(n),他们就知道不必费心去看了。
标签: java multithreading wait