Java 如何使用wait()和notifyAll()暂停函数,直到某个值增加超过某个值

Java 如何使用wait()和notifyAll()暂停函数,直到某个值增加超过某个值,java,multithreading,wait,Java,Multithreading,Wait,我正在编写的程序有一个小问题,它是一个银行模拟器,我遇到的具体问题是这两个功能: 以下代码位于Account类中: public synchronized boolean withdraw(int amount){ try{ System.out.println("Balance = " + balance + " amount = "+ amount); while(amount &

我正在编写的程序有一个小问题,它是一个银行模拟器,我遇到的具体问题是这两个功能:

以下代码位于Account类中:

    public synchronized boolean withdraw(int amount){
        try{
            System.out.println("Balance = " + balance + " amount = "+ amount);
            while(amount > balance){
                wait();
            }
        }
        catch (InterruptedException e){
            e.printStackTrace();
        }
        int currentBalance = balance;
        //Thread.yield(); // Try to force collision
        int newBalance = currentBalance - amount;
        balance = newBalance;
        return true;
    }
    public synchronized void deposit(int amount) {
        int currentBalance = balance;
        Thread.yield();   // Try to force collision
        int newBalance = currentBalance + amount;
        balance = newBalance;
        notifyAll();
    }

编辑以添加以下内容:

银行类就是所谓的取款和存款功能:下面是代码:

    public void transfer(int from, int to, int amount) {
        synchronized (this) {
            counter++;
            try {
                while (isTesting) {
                    wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (accounts[from].withdraw(amount)) {
                accounts[to].deposit(amount);
            }
       
            counter--;
            notifyAll();

            if (shouldTest()) test();
        }
    }
transfer()中的wait()调用工作得很好,我认为我不应该担心它的功能。但是,正如您看到的,第一次调用取款支票以查看交易是否可以发生,如果可以,它将返回true并继续存款。当实际运行程序时,一旦在任何线程中余额低于金额,程序就会冻结,不会切换到另一个线程,我已经用print语句确认了这一点

基本上,我需要提款功能做的是检查经常账户的余额,如果余额低于提款金额,它将等待其他账户的可用资金存入

我希望存款能够接受来自其他线程的钱,并调用notifyAll()函数来唤醒当前正在等待的线程,然后再次检查条件。不幸的是,无论何时调用wait函数,程序都会完全停止挂起,并且根据调试器,所有其他线程都处于监视状态


我非常感谢您的帮助,如果您对我的代码有任何疑问,或者您希望我包含更多,请随时询问我,我将编辑此问题。如果有另一条线索已经在问同样的问题,你介意帮我找到它吗?我已经在网上搜索过了,没有发现任何东西对我的具体情况有帮助。非常感谢。

您的代码看起来不错。问题可能出现在调用
draw
deposit
“程序完全停止”的代码中。那么,当您在
draw()
方法中等待资金时,您似乎没有任何其他线程调用
deposit()
当然,因为我们看不到任何真正启动线程的代码,所以我们只能猜测。我添加了更多的代码,我还修正了这个句子的措辞,我的意思是说程序挂起,不会完全停止。同意Andreas的观点。还要注意,如果取款和存款在同一个线程中运行,并且它们都是同步的,并且您在同步块中调用了wait,则不确定存款的收益率将如何运行以中断等待。我认为Andreas建议您显示驱动和编排线程的代码。由于transfer()方法也在同步,因此似乎在任何时候都只能进行一次传输。然后,如果draw()函数开始等待足够的余额,这似乎不会发生,因为没有任何其他存款来自bank类(正在等待draw成功)。除非您有多个银行类实例,但我们无法从您共享的代码中看到这一点。