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

时间:2015-10-10 10:48:03

标签: java multithreading

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书中,上面例子的输出是:

link

见输出的第三行。 那是 The Output

这可能发生吗? 那就是Monika可以在没有输出撤销声明的情况下醒来。不应该莫妮卡线程也开始“莫妮卡即将退出”。这就是莫妮卡线程如何开始“莫妮卡醒来”的声明。

我在Netbeans中尝试过,每次尝试它时,都是从“Monika即将撤回声明”开始的。 那么书中给出的输出是错误的吗? 如果没有,有人可以解释一下这个。 再次感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

只是图像从一开始就没有打印件。 for循环大约10次。如果你从Monica踏板的底部倒数,你只能看到只有7个半的迭代次数。

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

然后,当Monica线程进入睡眠状态时,与Ryan混合的以下行会计数2次半迭代。 “莫妮卡即将退出” “莫妮卡要睡觉了” “莫妮卡醒了。” “莫妮卡完成撤回”

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