当前位置:嗨网首页>书籍在线阅读

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() 方法来初始化 operationscommission 字段:

public void setBalance(long balance) {
  this.balance.set(balance);
  operations.reset();
  commission.reset();
}

6.实现一个 addAmount() 方法来增加 balance 字段值。另外,用 LongAdderincrement() 方法来增加 operations 字段值,并且用 accumulate() 方法来为 commission 对象累计每个单位加账户的20%的值:

public void addAmount(long amount) {
  this.balance.getAndAdd(amount);
  this.operations.increment();
  this.commission.accumulate(amount);
}

7.实现一个 subtractAmount() 方法来减少 balance 字段值。如同 addAmount() 方法一样,也应有修改 operationscommission 字段的操作:

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() 方法。用 accountaddAmount()方 法来给它的 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() 方法。用 accountsubtractAmount() 方法,从它的 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.在控制台打印 accountbalance 初始值:

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();
}