// Online Java Compiler /*interface product { void buy(int num); } class genproduct implements product { int quan; genproduct(int n) { quan=n; } public synchronized void buy(int num) { if(quan extends Thread { T obj; int num; inventory(T obj,int num) { this.obj=obj; this.num=num; } public void run() { obj.buy(num); } } class Mainclass { public static void main(String[] args) { genproduct buyer1 =new genproduct(15); inventory t1=new inventory(buyer1,2); inventory t2=new inventory(buyer1,5); // obj.start(); t1.start(); t2.start(); } }*/ class BankAccount { private int balance; private int accountNumber; public BankAccount(int accountNumber, int initialBalance) { this.accountNumber = accountNumber; this.balance = initialBalance; } public synchronized void deposit(int amount) { balance += amount; System.out.println("Deposited: " + amount); System.out.println("Current Balance after Deposit: " + balance); } public synchronized void withdraw(int amount) { if (balance >= amount) { balance -= amount; System.out.println("Withdrawn: " + amount); System.out.println("Current Balance after Withdrawal: " + balance); } else { System.out.println("Insufficient funds for withdrawal."); } } } class TransactionThread extends Thread { private BankAccount account; private boolean isDeposit; private int amount; public TransactionThread(BankAccount account, boolean isDeposit, int amount) { this.account = account; this.isDeposit = isDeposit; this.amount = amount; } public void run() { if (isDeposit) { account.deposit(amount); } else { account.withdraw(amount); } } } class Practice_question{ public static void main(String[] args) { BankAccount account = new BankAccount(12345, 1000); // Create multiple threads for deposits and withdrawals TransactionThread depositThread1 = new TransactionThread(account, true, 500); TransactionThread withdrawThread1 = new TransactionThread(account, false, 200); TransactionThread depositThread2 = new TransactionThread(account, true, 100); TransactionThread withdrawThread2 = new TransactionThread(account, false, 300); // Start the threads depositThread1.start(); withdrawThread1.start(); depositThread2.start(); withdrawThread2.start(); // Wait for all threads to finish try { depositThread1.join(); withdrawThread1.join(); depositThread2.join(); withdrawThread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }