28-案例实现
案例实现
根据如下步骤来实现本案例。
1.创建一个 Account
类来模拟一个银行账户:
public class Account {
2.声明一个 AtomicLong
类型的 balance
私有字段来存储账户的结余。此外,声明一个 LongAdder
类型的 operations
私有字段以及一个 DoubleAccumulator
类型的 commission
私有字段:
private final AtomicLong balance;
private final LongAdder operations;
private final DoubleAccumulator commission;
3.实现一个构造方法来初始化该类的字段。对于 DoubleAccumulator
类来说,其身份值是0,并且在作为参数传递的lambda表达式中,把它与0.2相乘再相加,然后更新其实际值:
public Account() {
balance = new AtomicLong();
operations = new LongAdder();
commission = new DoubleAccumulator((x,y)-> x+y*0.2, 0);
}
4.实现方法来获取3个字段值:
public long getBalance() {
return balance.get();
}
public long getOperations() {
return operations.longValue();
}
public double getCommission() {
return commission.get();
}
5.实现一个 setBalance()
方法来设定 balance
字段值。同时也必须要用 reset()
方法来初始化 operations
和 commission
字段:
public void setBalance(long balance) {
this.balance.set(balance);
operations.reset();
commission.reset();
}
6.实现一个 addAmount()
方法来增加 balance
字段值。另外,用 LongAdder
的 increment()
方法来增加 operations
字段值,并且用 accumulate()
方法来为 commission
对象累计每个单位加账户的20%的值:
public void addAmount(long amount) {
this.balance.getAndAdd(amount);
this.operations.increment();
this.commission.accumulate(amount);
}
7.实现一个 subtractAmount()
方法来减少 balance
字段值。如同 addAmount()
方法一样,也应有修改 operations
和 commission
字段的操作:
public void subtractAmount(long amount) {
this.balance.getAndAdd(-amount);
this.operations.increment();
this.commission.accumulate(amount);
}
8.创建一个 Company
类并实现 Runnable
接口。该类用来模拟公司的付款业务:
public class Company implements Runnable {
9.声明一个 Account
类型的 account
私有字段:
private final Account account;
10.声明该类的一个构造方法并初始化其字段:
public Company(Account account) {
this.account=account;
}
11.实现任务的 run()
方法。用 account
的 addAmount()方
法来给它的 balance
增加10个1000:
@Override
public void run() {
for (int i=0; i<10; i++){
account.addAmount(1000);
}
}
12.创建一个 Bank
类并实现 Runnable
接口。该类用来模拟账户资金退出业务:
public class Bank implements Runnable {
13.声明一个 Account
类型的 account
私有字段:
private final Account account;
14.实现该类的一个构造方法并初始化其字段:
public Bank(Account account) {
this.account=account;
}
15.实现任务的 run()
方法。用 account
的 subtractAmount()
方法,从它的 balance
中减少10个1000:
@Override
public void run() {
for (int i=0; i<10; i++){
account.subtractAmount(1000);
}
}
16.实现本案例的主类,新建 Main
类和 main()
方法:
public class Main {
public static void main(String[] args) {
17.创建一个 Account
对象并设定其 balance
为1000:
Account account=new Account();
account.setBalance(1000);
18.创建一个新的 Company
的任务并用线程来执行它:
Company company=new Company(account);
Thread companyThread=new Thread(company);
19.创建一个新的 Bank
任务并用一个线程来执行它:
Bank bank=new Bank(account);
Thread bankThread=new Thread(bank);
20.在控制台打印 account
的 balance
初始值:
System.out.printf("Account : Initial Balance: %d\n",
account.getBalance());
21.启动这些线程:
companyThread.start();
bankThread.start();
22.用 join()
方法来等待所有线程执行完成,并且在控制台打印 balance
的最终值、 operations
的数值、 commission
的累计值:
try {
companyThread.join();
bankThread.join();
System.out.printf("Account : Final Balance: %d\n",
account.getBalance());
System.out.printf("Account : Number of Operations: %d\n",
account.getOperations().intValue());
System.out.printf("Account : Accumulated commissions: %f\n",
account.getCommission().doubleValue());
} catch (InterruptedException e) {
e.printStackTrace();
}