0

だから、大学の問題を解決するのに苦労しています...私がする必要があるのは:

同時実行を使用して口座間の送金をシミュレートするアプリを作成する必要があります。次のように Bank クラスでこの転送を行うメソッドを作成する必要があります。

transfer(int from, int to, int value)

次に、この転送を管理する TransferThread クラスを作成する必要があります。

問題は、常にデッドロックが発生していることです...これまでに行ったこと:

転送スレッド:

public void run() {
        int para,de,valor;
        try
        {
            while(!interrupted())
            {
                para = new Random().nextInt(banco.getNUMCONTAS());
                de = new Random().nextInt(banco.getNUMCONTAS());
                valor = (int) (10000 * Math.random());
                if(de == para)
                    continue;
                banco.transfer(de, para, valor);
                sleep(1);
            }
        }catch(InterruptedException e)
        {
            System.out.println(e.getMessage());
        }
    }

バンコ:

  public synchronized void transfer(int de, int para, int valor) {
        while(contas[de].getSaldo() - valor <= 0)
        {
            try
            {
                wait();
            }catch(InterruptedException e)
            {

            }
        }
        notifyAll();
        contas[de].setSaldo(-valor);
        contas[para].setSaldo(valor);
        System.out.println("Conta num: " + contas[de].getNum() + ". Saldo: " + contas[de].getSaldo());
        System.out.println("Conta num: " + contas[para].getNum() + ". Saldo: " + contas[para].getSaldo());
    }

そしてメイン:

Banco b = new Banco();
        TransferThread[] threads = new TransferThread[2];
        for(int i = 0; i < 2; i++){
            threads[i] = new TransferThread(b);
            threads[i].start();
        }

どうすればこれを機能させることができますか?

4

2 に答える 2

1

銀行の例は、学生にスレッドを導入するときに非常によく使用されますが、それが教えることを目的とする通常のアイデアは、コードの問題ではありません。

どういうわけか、アカウントに十分なお金がないときは永遠に待っているように見えます。両方のスレッドが待っていても、魔法のようにそこに表示されることはありません。どちらも単に無限ループに陥っています。

于 2012-06-23T06:18:15.607 に答える
1

提案 -

ご存知のように、「転送」には、「プット」と「ゲット」という 2 つの異なる当事者による 2 つのことが含まれます。

これら 2 つのメソッドを追加して同期することを検討してください(「転送」全体ではなく)。

ちょっとした考え...

于 2012-06-23T06:23:30.130 に答える