我有以下情况。我有一个帐户类,每个帐户有一个余额和钱可以转移到它。螺纹银行转帐模拟和同步
public class Account {
private int balance;
public Account() {
this.balance = 0;
}
public void transfer(int amount) {
this.balance += amount;
}
@Override
public String toString() {
return "Account (balance: " + balance + ")";
}
}
而且我有一个调动管理器。转账只需要两个账户和一笔钱转移。传输管理器可以通过将传输管理器添加到传输队列类型的数组列表来发布传输。在所有传输添加到队列后,可以调用performTransfers方法,该方法在每次传输时调用performTransfer方法。
import java.util.ArrayList;
public class TransferManager {
private ArrayList<Transfer> openTransfers;
private int issuedTransfers;
private int performedTransfers;
public TransferManager() {
openTransfers = new ArrayList<Transfer>();
issuedTransfers = 0;
performedTransfers = 0;
}
public void issueTransfer(Account from, Account to, int amount) {
openTransfers.add(new Transfer(from, to, amount));
issuedTransfers++;
}
public void performTransfers() {
for(Transfer transaction : openTransfers) {
transaction.performTransfer();
performedTransfers++;
}
openTransfers.clear();
}
@Override
public String toString() {
return "TransferManager (openTransfers: " + openTransfers.size() + "; issuedTransfers: " + issuedTransfers + "; performedTransfers: " + performedTransfers + ")";
}
private static class Transfer {
private Account from, to;
private int amount;
public Transfer(Account from, Account to, int amount) {
this.from = from;
this.to = to;
this.amount = amount;
}
public void performTransfer() {
from.transfer(-amount);
to.transfer(amount);
}
}
}
现在我想补充的多线程:
import java.util.Random;
public class BankingTest extends Thread {
private Account[] accounts;
private static Random random = new Random();
public BankingTest(Account[] accounts) {
this.accounts = accounts;
}
public void run() {
final TransferManager manager = new TransferManager();
//simulate some transfers
for(int i = 0; i < accounts.length; i++) {
final int index = i;
Thread thread = new Thread() {
public void run() {
try {
for(int j = 0; j < 10; j++) {
manager.issueTransfer(accounts[index], accounts[(index+1)%accounts.length], 100);
Thread.sleep(random.nextInt(10));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
}
//wait a bit
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
manager.performTransfers();
System.out.println(manager);
}
}
BankingTest花费的说10个空账户的数组。现在它是不同步的,我试着去理解为什么我得到这些错误:
Exception in thread "Thread-2" java.lang.NullPointerException
at
gp2.ha5.exercise2.TransferManager.performTransfers(TransferManager.java:23)
at gp2.ha5.exercise2.BankingTest.run(BankingTest.java:41)
and
TransferManager (openTransfers: 0; issuedTransfers: 99; performedTransfers:
99)
任何想法,为什么我得到这些错误,在这里怎么能同步帮助?
(你可以放大查看细节;))
TransferManager:http://pastebin.com/Je4ExhUz
BankTest:http://pastebin.com/cdpWhHPb
开始:http://pastebin.com/v7pwJ5T1
后我加入了同步到issueTransfer和performTransfers方法我不断收到错误:
没有行号就难以阐述。你能否考虑在代码片段中添加行号(即使你的屏幕截图有不同的行号也不是引用的异常)? – mindas 2011-05-08 11:06:08
好吧,我已经添加了源代码粘贴。 – 2011-05-08 11:09:15