下面的while循环可以运行多次吗?
Is the following while loop can be run more than one time?
我在Android src代码中找到了一段代码,很容易但是我看不懂。下面的代码是一个更大函数的一部分(我认为不需要其他部分来回答我的问题)
timeoutMs = 10000 // timeoutMs is a function parameter but for the example i have initiated it here
if (timeoutMs > 0) {
long nowMs = SystemClock.uptimeMillis();
long deadlineMs = nowMs + timeoutMs;
while (!isDone() && nowMs < deadlineMs) {
wait(deadlineMs - nowMs);
nowMs = SystemClock.uptimeMillis();
}
}
while循环似乎最多运行一次(取决于isDone值)。在第二个循环中是否存在以下条件:nowMs < deadlineMs 为真?
在我看来,在第二种情况下它们已经相等了。对吗?
您似乎有点误会了:wait(100)
不会等待 100 毫秒!你会认为它确实如此(它读起来几乎像英语,字面意思是:“等待 100”),但事实并非如此。那不是等待的目的。 Thread.sleep(100)
是 java-ese for 'please wait for about 100 milliseconds'。 wait(100)
是 java-ese 的原因:请等待通知到达。但是,尽量不要等待超过 100 毫秒。
让我解释一下:wait(x)
是对对象的调用,它不是实用方法。你在某事上调用它。在这种情况下,正如您刚刚写的 wait
而不是 foo.wait
,因此,您在 this
上调用它;它与 this.wait(100)
完全相同。这意味着两件事:[A] 这段代码必须在 syncronized(this)
块内,否则 wait 调用将立即抛出异常(为什么?因为 wait
/notify
系统如此规定- 请参阅这些方法的 javadoc。这些方法在 j.l.Object 本身中),关键 [B],此代码的主要目的是等待另一个线程调用 x.notify()
或 x.notifyAll()
,其中 x
解析为粘贴代码中 this
解析的同一对象标识。但是,100
部分就像一个限制:尽量不要等待超过该限制。换句话说,线程将进入休眠状态,然后在 deadlineMs - nowMs
毫秒后 或更早 唤醒,如果 this
是 notify/notifyAlled。
你想的是possible/likelyThread.sleep(100)
,确实尝试暂停100毫秒左右,不玩任何打断游戏。 Thread.sleep
没有 notify
部分,并且您不会对任何特定对象调用 sleep
。这是一个静态方法。如果 this
在中途获得 notify/notifyAll-ed,则您粘贴的代码将 运行 多次通过 while 循环。
--编辑--
显然还有一些事情不清楚:
"Isn't 100 ms is the maximum?"
没有。对于初学者来说,CPUs 和计算机通常不是那么准确,除非你特意为之,并关闭它正在做的所有其他事情。如果恰好 100 毫秒后 CPU 忙于在后台安装应用程序更新,同时将 HDR 应用于该图片,并将另一张上传到 gdrive,也许就在这一毫秒,没有任何时间 运行你的东西,也许在大约 5 毫秒后你就可以开始了,到那时它已经过了 105 毫秒。
此外,wait()
意味着锁定 - 如果您没有锁定,调用会立即崩溃。 wait() 放弃锁,在代码继续之前,必须重新获取锁,否则线程无法取消暂停。如果运气不好,这可能需要一年的时间:持有锁的所有其他线程必须首先进展到不再持有它。这部分不适用于 Thread.sleep
,这是 Thread.sleep
简单的另一个原因:“等待 x 毫秒左右”,而 wait() 是一个复杂得多的野兽,它涉及通知和锁定获取和超时。
What is the meaning of wait(0)? Can't understand argument 0.
这意味着:等到 notify() 进来。如果必须,请永远等待。
Thread.sleep(0)
很简单:什么都不做(等待 0 毫秒 - 好的,完成。这很容易)。请记住,wait()
的主要目的是 等待其他线程 运行 代码 x.notify()
,其中 x 是您调用的同一对象 wait()
on,超时是事后才想到的。 0 表示:没有超时,并且是默认行为(也有一个 wait()
方法,它只是 wait(0)
)。
可以是小于 'timeout' 毫秒的任意时间。
我在Android src代码中找到了一段代码,很容易但是我看不懂。下面的代码是一个更大函数的一部分(我认为不需要其他部分来回答我的问题)
timeoutMs = 10000 // timeoutMs is a function parameter but for the example i have initiated it here
if (timeoutMs > 0) {
long nowMs = SystemClock.uptimeMillis();
long deadlineMs = nowMs + timeoutMs;
while (!isDone() && nowMs < deadlineMs) {
wait(deadlineMs - nowMs);
nowMs = SystemClock.uptimeMillis();
}
}
while循环似乎最多运行一次(取决于isDone值)。在第二个循环中是否存在以下条件:nowMs < deadlineMs 为真? 在我看来,在第二种情况下它们已经相等了。对吗?
您似乎有点误会了:wait(100)
不会等待 100 毫秒!你会认为它确实如此(它读起来几乎像英语,字面意思是:“等待 100”),但事实并非如此。那不是等待的目的。 Thread.sleep(100)
是 java-ese for 'please wait for about 100 milliseconds'。 wait(100)
是 java-ese 的原因:请等待通知到达。但是,尽量不要等待超过 100 毫秒。
让我解释一下:wait(x)
是对对象的调用,它不是实用方法。你在某事上调用它。在这种情况下,正如您刚刚写的 wait
而不是 foo.wait
,因此,您在 this
上调用它;它与 this.wait(100)
完全相同。这意味着两件事:[A] 这段代码必须在 syncronized(this)
块内,否则 wait 调用将立即抛出异常(为什么?因为 wait
/notify
系统如此规定- 请参阅这些方法的 javadoc。这些方法在 j.l.Object 本身中),关键 [B],此代码的主要目的是等待另一个线程调用 x.notify()
或 x.notifyAll()
,其中 x
解析为粘贴代码中 this
解析的同一对象标识。但是,100
部分就像一个限制:尽量不要等待超过该限制。换句话说,线程将进入休眠状态,然后在 deadlineMs - nowMs
毫秒后 或更早 唤醒,如果 this
是 notify/notifyAlled。
你想的是possible/likelyThread.sleep(100)
,确实尝试暂停100毫秒左右,不玩任何打断游戏。 Thread.sleep
没有 notify
部分,并且您不会对任何特定对象调用 sleep
。这是一个静态方法。如果 this
在中途获得 notify/notifyAll-ed,则您粘贴的代码将 运行 多次通过 while 循环。
--编辑--
显然还有一些事情不清楚:
"Isn't 100 ms is the maximum?"
没有。对于初学者来说,CPUs 和计算机通常不是那么准确,除非你特意为之,并关闭它正在做的所有其他事情。如果恰好 100 毫秒后 CPU 忙于在后台安装应用程序更新,同时将 HDR 应用于该图片,并将另一张上传到 gdrive,也许就在这一毫秒,没有任何时间 运行你的东西,也许在大约 5 毫秒后你就可以开始了,到那时它已经过了 105 毫秒。
此外,wait()
意味着锁定 - 如果您没有锁定,调用会立即崩溃。 wait() 放弃锁,在代码继续之前,必须重新获取锁,否则线程无法取消暂停。如果运气不好,这可能需要一年的时间:持有锁的所有其他线程必须首先进展到不再持有它。这部分不适用于 Thread.sleep
,这是 Thread.sleep
简单的另一个原因:“等待 x 毫秒左右”,而 wait() 是一个复杂得多的野兽,它涉及通知和锁定获取和超时。
What is the meaning of wait(0)? Can't understand argument 0.
这意味着:等到 notify() 进来。如果必须,请永远等待。
Thread.sleep(0)
很简单:什么都不做(等待 0 毫秒 - 好的,完成。这很容易)。请记住,wait()
的主要目的是 等待其他线程 运行 代码 x.notify()
,其中 x 是您调用的同一对象 wait()
on,超时是事后才想到的。 0 表示:没有超时,并且是默认行为(也有一个 wait()
方法,它只是 wait(0)
)。
可以是小于 'timeout' 毫秒的任意时间。