feat: add advanced multithreading banking system skeleton
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
package dev.banking;
|
||||
|
||||
import dev.banking.service.BankingSystem;
|
||||
|
||||
/**
|
||||
* Creates a ready-to-run demonstration environment.
|
||||
*
|
||||
* Students do not need to modify this class.
|
||||
*/
|
||||
public final class DemoFactory {
|
||||
|
||||
private DemoFactory() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a fully configured banking simulation system.
|
||||
*
|
||||
* This includes:
|
||||
* - Bank accounts
|
||||
* - Transaction stream generator / loader
|
||||
* - ExecutorService (thread pool)
|
||||
* - Transaction processor
|
||||
* - Live monitoring system
|
||||
*
|
||||
* @return configured BankingSystem instance
|
||||
*/
|
||||
public static BankingSystem createDemoSystem() {
|
||||
|
||||
/*
|
||||
* TODO (Instructor Implementation Only)
|
||||
*
|
||||
* Example responsibilities:
|
||||
*
|
||||
* 1. Create bank accounts:
|
||||
* - Account(1, 1000)
|
||||
* - Account(2, 2000)
|
||||
* - Account(3, 1500)
|
||||
*
|
||||
* 2. Create transaction list or stream
|
||||
*
|
||||
* 3. Initialize ExecutorService:
|
||||
* Executors.newFixedThreadPool(n)
|
||||
*
|
||||
* 4. Create TransactionProcessor
|
||||
*
|
||||
* 5. Create BankingSystem and inject dependencies
|
||||
*
|
||||
* 6. Attach LiveMonitor (optional)
|
||||
*/
|
||||
|
||||
throw new UnsupportedOperationException(
|
||||
"Instructor implementation required."
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package dev.banking.model;
|
||||
|
||||
public class BankAccount {
|
||||
|
||||
private final int accountId;
|
||||
private long balance;
|
||||
|
||||
public BankAccount(int accountId, long initialBalance) {
|
||||
this.accountId = accountId;
|
||||
this.balance = initialBalance;
|
||||
}
|
||||
|
||||
public int getAccountId() {
|
||||
return accountId;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO
|
||||
* Implement a thread-safe balance reader.
|
||||
*/
|
||||
public long getBalance() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO
|
||||
* Implement a thread-safe deposit operation.
|
||||
*/
|
||||
public void deposit(int amount) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO
|
||||
* Implement a thread-safe withdrawal operation.
|
||||
*/
|
||||
public void withdraw(int amount) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO
|
||||
* Implement an atomic and deadlock-free transfer.
|
||||
*/
|
||||
public void transfer(BankAccount target, int amount) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package dev.banking.model;
|
||||
|
||||
public class Transaction {
|
||||
|
||||
private final TransactionType type;
|
||||
|
||||
private final int sourceAccountId;
|
||||
private final int targetAccountId;
|
||||
|
||||
private final int amount;
|
||||
|
||||
public Transaction(
|
||||
TransactionType type,
|
||||
int sourceAccountId,
|
||||
int targetAccountId,
|
||||
int amount
|
||||
) {
|
||||
this.type = type;
|
||||
this.sourceAccountId = sourceAccountId;
|
||||
this.targetAccountId = targetAccountId;
|
||||
this.amount = amount;
|
||||
}
|
||||
|
||||
public TransactionType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public int getSourceAccountId() {
|
||||
return sourceAccountId;
|
||||
}
|
||||
|
||||
public int getTargetAccountId() {
|
||||
return targetAccountId;
|
||||
}
|
||||
|
||||
public int getAmount() {
|
||||
return amount;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package dev.banking.model;
|
||||
|
||||
public enum TransactionType {
|
||||
DEPOSIT,
|
||||
WITHDRAW,
|
||||
TRANSFER
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package dev.banking.monitor;
|
||||
|
||||
import dev.banking.model.BankAccount;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class LiveMonitor {
|
||||
|
||||
public void update(
|
||||
Collection<BankAccount> accounts
|
||||
) {
|
||||
|
||||
for (BankAccount account : accounts) {
|
||||
|
||||
System.out.printf(
|
||||
"Account %d -> %d%n",
|
||||
account.getAccountId(),
|
||||
account.getBalance()
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package dev.banking.processor;
|
||||
|
||||
import dev.banking.model.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class TransactionProcessor {
|
||||
|
||||
private final Map<Integer, BankAccount> accounts;
|
||||
|
||||
public TransactionProcessor(
|
||||
Map<Integer, BankAccount> accounts
|
||||
) {
|
||||
this.accounts = accounts;
|
||||
}
|
||||
|
||||
public void process(Transaction tx) {
|
||||
|
||||
BankAccount source =
|
||||
accounts.get(tx.getSourceAccountId());
|
||||
|
||||
switch (tx.getType()) {
|
||||
|
||||
case DEPOSIT -> {
|
||||
source.deposit(tx.getAmount());
|
||||
}
|
||||
|
||||
case WITHDRAW -> {
|
||||
source.withdraw(tx.getAmount());
|
||||
}
|
||||
|
||||
case TRANSFER -> {
|
||||
|
||||
BankAccount target =
|
||||
accounts.get(tx.getTargetAccountId());
|
||||
|
||||
source.transfer(
|
||||
target,
|
||||
tx.getAmount()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package dev.banking.service;
|
||||
|
||||
import dev.banking.model.*;
|
||||
import dev.banking.processor.TransactionProcessor;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
public class BankingSystem {
|
||||
|
||||
private final ExecutorService executor;
|
||||
private final TransactionProcessor processor;
|
||||
|
||||
public BankingSystem(
|
||||
ExecutorService executor,
|
||||
TransactionProcessor processor
|
||||
) {
|
||||
this.executor = executor;
|
||||
this.processor = processor;
|
||||
}
|
||||
|
||||
public void processTransactions(
|
||||
List<Transaction> transactions
|
||||
) {
|
||||
|
||||
for (Transaction tx : transactions) {
|
||||
|
||||
executor.submit(() -> {
|
||||
processor.process(tx);
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user