class BankAccount
{
private int balance = 100;
public int getBalance()
{
return balance;
}
public void withdraw(int amount)
{
balance = balance - amount;
}
}
public class RyanAndMonicaJob implements Runnable{
private BankAccount account = new BankAccount();
public static void main(String[] args) {
RyanAndMonicaJob theJob = new RyanAndMonicaJob();
Thread one = new Thread(theJob);
Thread two = new Thread(theJob);
one.setName("Ryan");
two.setName("Monica");
one.start();
two.start();
}
public void run()
{
for(int x = 0;x < 10;x++)
{
makeWithdrawl(10);
if(account.getBalance() < 10)
{
System.out.println("Overdrawn!");
}
}
}
public void makeWithdrawl(int amount)
{
if(account.getBalance() >= amount)
{
System.out.println(Thread.currentThread().getName() + " is about to withdraw");
try{
System.out.println(Thread.currentThread().getName() + " is going to sleep");
Thread.sleep(500);
}
catch(InterruptedException ex)
{
ex.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " woke up.");
account.withdraw(amount);
System.out.println(Thread.currentThread().getName() + " completes the withdrawl");
}
else
{
System.out.println("Sorry , not enough for " + Thread.currentThread().getName());
}
}
}
在Head第一本Java书中,上面例子的输出是:
这可能发生吗? 那就是Monika可以在没有输出撤销声明的情况下醒来。不应该莫妮卡线程也开始“莫妮卡即将退出”。这就是莫妮卡线程如何开始“莫妮卡醒来”的声明。
我在Netbeans中尝试过,每次尝试它时,都是从“Monika即将撤回声明”开始的。 那么书中给出的输出是错误的吗? 如果没有,有人可以解释一下这个。 再次感谢您的帮助。
答案 0 :(得分:1)
只是图像从一开始就没有打印件。 for循环大约10次。如果你从Monica踏板的底部倒数,你只能看到只有7个半的迭代次数。
“对不起,莫妮卡不够”重复5次
然后,当Monica线程进入睡眠状态时,与Ryan混合的以下行会计数2次半迭代。 “莫妮卡即将退出” “莫妮卡要睡觉了” “莫妮卡醒了。” “莫妮卡完成撤回”
这意味着在此之前有更多输出。它只是不适合控制台。