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

建议 -

如您所知,“转移”涉及两件事,由两个不同的方进行:“Put”和“Get”。

考虑添加这两种方法并同步它们(而不是整个“传输”)。

只是一个想法...

于 2012-06-23T06:23:30.130 回答