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());
    }
}

}


在第一本Java书籍中,上述示例的输出为:

java - Head First java书中的多线程示例。请解释-LMLPHP

参见输出的第三行。
那是
java - Head First java书中的多线程示例。请解释-LMLPHP

这会发生吗?
那莫妮卡可以从唤醒而不开始输出撤消语句开始。 Monika线程也不应以“ Monika即将退出”开头。这就是Monika线程如何以“ Monika wake up”语句开头的原因。

我在Netbeans中尝试过,每次尝试时,它都以“ Monika将要撤回声明”开头。
那么书中给出的输出是错误的吗?
如果不能,请给我解释一下。
再次感谢您的帮助。

最佳答案

只是从开始就没有图像打印。
for循环大约10次。如果从底部开始倒数莫妮卡(Monica)踏板,则只能看到7个半迭代。

重复5次“对不起,莫妮卡”

然后,当Monica线程进入睡眠状态时,以下与Ryan混杂在一起的行将进行2次半迭代。
“莫妮卡即将撤离”
“莫妮卡要睡觉了”
“莫妮卡醒了。”
“莫妮卡完成了提款”

这意味着在此之前会有更多的输出。它只是不完全适合控制台。

10-06 14:52