由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Java版 - look at these code, why so frustrating?
相关主题
Ant and Netbeans helpaspectJ + ant , how to define task?
请教:Junit fails as an Ant taskExecutorCompletionService 中submit的task个数如何得到?
eclipse question,please help怎么样让jar在64位JRE下运行啊?
Timer and TimerTaskThreadLocal 的一个 use case
[合集] Swing问题:Auto hide task bar 如何实现?天天只干基础的活
question on ant taskMastering the classpath with JWhich
Why System.currentTimeMillis() is later then TimerTask.scheduledExecutionTime() in some cases?[转载] java sex package
java.util.timer的TimerTask有priority吗?求救。java的格式化输出
相关话题的讨论汇总
话题: amount话题: balance话题: withdraw话题: task话题: while
进入Java版参与讨论
1 (共1页)
s****s
发帖数: 628
1
public void withdraw(int amount) {
56 lock.lock();// Acquire the lock
57 try {
58 while (balance < amount) {
59 System.out.println("\t\t\tWait for a deposit")
60 newDeposit.await();
61 }
62
63 balance -= amount;
64 System.out.println("\t\t\tWithdraw " + amount +
65 "\t\t" + getBalance());
66 }
67 catch (InterruptedException ex) {
68 ex.printStackTrace();
69 }
70 finally {
71 // Release the lock
72 }
73 }
书上说:
What will happen if you replace the while loop in lines 59–60 with the
following if
statement?
if (balance < amount) {
System.out.println("\t\t\tWait for a deposit");
newDeposit.await();
}
The deposit task will notify the withdraw task whenever the balance changes.
(balance < amount) may still be true when the withdraw task is awakened.
Using the if statement, the withdraw task may wait forever.
我觉得无法理解为什么, while loop 变成 if 之后, withdraw就要wait forever???
z*******3
发帖数: 13709
2
while是持久性循环
只要条件成立,就一直执行下去
if是一次性判断,只判断一次
无论条件是否成立,都只执行一次
类似game里面的loop
你把所有的game loop的while改成if
就知道了,大部分动画基本上都停止不动了

【在 s****s 的大作中提到】
: public void withdraw(int amount) {
: 56 lock.lock();// Acquire the lock
: 57 try {
: 58 while (balance < amount) {
: 59 System.out.println("\t\t\tWait for a deposit")
: 60 newDeposit.await();
: 61 }
: 62
: 63 balance -= amount;
: 64 System.out.println("\t\t\tWithdraw " + amount +

z*******3
发帖数: 13709
3
原来的意思类似
while(condition is true)
await
只要condition is true
就会一直await
一旦condition becomes false
就不在await,就会notify
而如果你改成if
那第一次if(condition is true)
就await
永远不会再次执行这个循环了
所以另外一个event driven的代码就停止不动鸟
s****s
发帖数: 628
4
谢谢回复.
如果是这样, 那么书上写得confusing了. 我把问题简单化一点.
withdraw(int amount){
while (balance < amount){ //如果用if???
await();
}
}
...
deposit(int amount){
balance += amount;
signaAll();
}
书上说deposit task 会通知withdraw task 当balance 一旦变化. (balance < amount
)可能依然是true当withdraw醒来的时候. 所以用if的话, withdraw会wait forever.
这里的问题是对sinalAll 和 await的理解:
1. 如果withdraw醒来,它依然会检查 (balance < amount)这个条件么? 如果(balance
< amount) 依然是true, withdraw是不是又要睡下去? 什么时候再醒?
2. 如果把 while (balance < amount)换成 if(balance < amount), 那么withdraw醒
来的时候, 不用再检查(balance < amount)这个条件, 不就可以往下执行了吗?
3.如果以上理解不对, 那应该是:
(1) while (balance < amount)
await();
withdraw 会不停的检查条件, 不符合就等. 过一会再检查. 那这个周期是多少?
(2)if(balance < amount)
await();
withdraw 只检查一次, 不符合就等. 然后等deposit task 叫醒, 叫醒了不就可以往下
执行了吗? 实在搞不懂了.
F****n
发帖数: 3271
5
deposit的钱就一定够了吗
用if 的话我deposit一分钱程序就crash了
用while回头再比较一边。

【在 s****s 的大作中提到】
: 谢谢回复.
: 如果是这样, 那么书上写得confusing了. 我把问题简单化一点.
: withdraw(int amount){
: while (balance < amount){ //如果用if???
: await();
: }
: }
: ...
: deposit(int amount){
: balance += amount;

z*******3
发帖数: 13709
6
while后面其实不是睡下去,是拼命执行下去
一般在while{}里面会有一个Thread.sleep();这样的东西
如果不间断轮循的话,效率会很低
资源很快就会被占满,这个应该说的没有什么特别的
无非是while和if的区别而已,应该不用太过于纠结这一块

【在 s****s 的大作中提到】
: 谢谢回复.
: 如果是这样, 那么书上写得confusing了. 我把问题简单化一点.
: withdraw(int amount){
: while (balance < amount){ //如果用if???
: await();
: }
: }
: ...
: deposit(int amount){
: balance += amount;

p*****2
发帖数: 21240
7
我看懂LZ的意思了。LZ看的什么书呀?我跟你的感觉一样。不会一直wait。
p*****2
发帖数: 21240
8

这个不需要用sleep吧?已经有wait了。

【在 z*******3 的大作中提到】
: while后面其实不是睡下去,是拼命执行下去
: 一般在while{}里面会有一个Thread.sleep();这样的东西
: 如果不间断轮循的话,效率会很低
: 资源很快就会被占满,这个应该说的没有什么特别的
: 无非是while和if的区别而已,应该不用太过于纠结这一块

p*****2
发帖数: 21240
9

为什么会crash呢?

【在 F****n 的大作中提到】
: deposit的钱就一定够了吗
: 用if 的话我deposit一分钱程序就crash了
: 用while回头再比较一边。

F****n
发帖数: 3271
10
不是crash, 是balance < 0

【在 p*****2 的大作中提到】
:
: 为什么会crash呢?

相关主题
question on ant taskaspectJ + ant , how to define task?
Why System.currentTimeMillis() is later then TimerTask.scheduledExecutionTime() in some cases?ExecutorCompletionService 中submit的task个数如何得到?
java.util.timer的TimerTask有priority吗?怎么样让jar在64位JRE下运行啊?
进入Java版参与讨论
p*****2
发帖数: 21240
11

balance<0为什么会crash?int可以有负数呀。

【在 F****n 的大作中提到】
: 不是crash, 是balance < 0
F****n
发帖数: 3271
12
我都没看后面的,assuming balance 不能小于0

【在 p*****2 的大作中提到】
:
: balance<0为什么会crash?int可以有负数呀。

p*****2
发帖数: 21240
13

这个很难让他们crash吧?除非你把Integer给封装了。

【在 F****n 的大作中提到】
: 我都没看后面的,assuming balance 不能小于0
F****n
发帖数: 3271
14
万一有business code基于balance >= 0的assumption可不就crash了吗

【在 p*****2 的大作中提到】
:
: 这个很难让他们crash吧?除非你把Integer给封装了。

p*****2
发帖数: 21240
15

这个有道理。不过这段代码应该不会吧。

【在 F****n 的大作中提到】
: 万一有business code基于balance >= 0的assumption可不就crash了吗
s****s
发帖数: 628
16
没有SLEEP. 我的CODE是直接COPY书上的.

【在 z*******3 的大作中提到】
: while后面其实不是睡下去,是拼命执行下去
: 一般在while{}里面会有一个Thread.sleep();这样的东西
: 如果不间断轮循的话,效率会很低
: 资源很快就会被占满,这个应该说的没有什么特别的
: 无非是while和if的区别而已,应该不用太过于纠结这一块

s****s
发帖数: 628
17
Introduction to java programming comprehensive version eighth edition (
daniel liang)

【在 p*****2 的大作中提到】
: 我看懂LZ的意思了。LZ看的什么书呀?我跟你的感觉一样。不会一直wait。
p*****2
发帖数: 21240
18

我没看这本书。不知道context,但是从你说的感觉它是错的。

【在 s****s 的大作中提到】
: Introduction to java programming comprehensive version eighth edition (
: daniel liang)

s****s
发帖数: 628
19
这本书据说口碑还行.

【在 p*****2 的大作中提到】
:
: 我没看这本书。不知道context,但是从你说的感觉它是错的。

p*****2
发帖数: 21240
20

无所谓吧。不用扣那么细。再说了,notify这东西最好不要用。而且你工作中用到的可
能性几乎为零,除非是legacy code。

【在 s****s 的大作中提到】
: 这本书据说口碑还行.
1 (共1页)
进入Java版参与讨论
相关主题
求救。java的格式化输出[合集] Swing问题:Auto hide task bar 如何实现?
useless to learn Javaquestion on ant task
sendRedirect problemWhy System.currentTimeMillis() is later then TimerTask.scheduledExecutionTime() in some cases?
大家都是什么时候model classes?java.util.timer的TimerTask有priority吗?
Ant and Netbeans helpaspectJ + ant , how to define task?
请教:Junit fails as an Ant taskExecutorCompletionService 中submit的task个数如何得到?
eclipse question,please help怎么样让jar在64位JRE下运行啊?
Timer and TimerTaskThreadLocal 的一个 use case
相关话题的讨论汇总
话题: amount话题: balance话题: withdraw话题: task话题: while