Computer Science 252
Problem Solving with Java
Fall 2013, The College of Saint Rose
ATM3 Demo
A working demo of ATM3 will appear below. Click inside the applet to interact with it.
ATM3 BlueJ Project
Click here to download a BlueJ project for ATM3.
ATM3 Source Code
The Java source code for ATM3 is below. Click on a file name to download it.
/* $Id: ATM.java 2269 2013-12-01 02:33:37Z terescoj $ */ /** * Class to represent ATM which withdraws money from a bank * Written 11/26/99 by Kim Bruce * Changed 3/16/00 by Barbara Lerner * Introduced a random pause in the critical section to make interference more probable. * Changed 5/7/02 by Jim Teresco to include a longer delay to better see * what is happening * * @author additional updates, Jim Teresco, Siena College, Spring 2011 * Additional updates, CSC 252, The College of Saint Rose, Fall 2013 * */ import java.util.Random; import javax.swing.JLabel; public class ATM extends Thread { private static final int MAX_PAUSE = 10; private static final int NUM_TRANSACTIONS = 1000; private Random pauseGenerator = new Random(); private Account account; private int change; // Amount of each transaction private JLabel info; // Where to display description of transactions private int total = 0; // Store parameters and start running public ATM(Account anAccount, int aChange, JLabel aInfo) { account = anAccount; change = aChange; info = aInfo; start(); } // Repeatedly withdraw "change" from account at bank. // This is effectively a deposit when "change" is negative. public void run() { for (int i = 0; i < NUM_TRANSACTIONS; i++) { account.changeBalance(change); total = total + change; info.setText("" + total); // demonstrate both with and without sleep //try { // sleep(400); //} //catch (Exception e) {} } } }
/* $Id: Bank.java 2269 2013-12-01 02:33:37Z terescoj $ */ /* * Class that represents a bank with two ATM's making deposits and withdrawals. * This program was designed to illustrate problems with concurrency. * Written 11/26/99 by Kim Bruce. * Changed 3/16/99 by Barbara Lerner to use a different UI showing just current values, not * a transaction history. * * @author updated by Jim Teresco, Siena College, Spring 2011 * Further updated for Swing and to remove dependency on Objectdraw * by Jim Teresco, The College of Saint Rose, Fall 2013, CSC 252 */ import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; // note that since this class does not need ObjectDraw but does have Java Swing // components, we extend "JApplet" instead of "WindowController" public class Bank extends JApplet implements ActionListener { private static final int INITIAL_BALANCE = 1000; // Initial balance in bank account private static final int TRANSACTION_AMOUNT = 100; // how much to deposit/withdraw per xaction private JLabel currentBalanceLabel; private JLabel withdrawTotalLabel; private JLabel depositTotalLabel; // Set up window layout and two ATM threads // The init method is the JApplet equivalent of a WindowController's begin method public void init() { JLabel startBalance = new JLabel("Starting balance: " + INITIAL_BALANCE, JLabel.CENTER); JLabel currentLabel = new JLabel("Current balance: ", JLabel.RIGHT); currentBalanceLabel = new JLabel("" + INITIAL_BALANCE + " ", JLabel.LEFT); JLabel withdrawLabel = new JLabel("Amount withdrawn: ", JLabel.RIGHT); withdrawTotalLabel = new JLabel(" 0 ", JLabel.LEFT); JLabel depositLabel = new JLabel("Amount deposited: ", JLabel.RIGHT); depositTotalLabel = new JLabel(" 0 ", JLabel.LEFT); setLayout(new GridLayout(0, 1)); this.setFont(new Font("System", Font.PLAIN, 18)); add(startBalance); JPanel balancePanel = new JPanel(); balancePanel.add(currentLabel); balancePanel.add(currentBalanceLabel); add(balancePanel); JPanel withdrawPanel = new JPanel(); withdrawPanel.add(withdrawLabel); withdrawPanel.add(withdrawTotalLabel); add(withdrawPanel); JPanel depositPanel = new JPanel(); depositPanel.add(depositLabel); depositPanel.add(depositTotalLabel); add(depositPanel); JPanel buttonPanel = new JPanel(); JButton runIt = new JButton("Run demo"); buttonPanel.add(runIt,"South"); add(buttonPanel); runIt.addActionListener(this); } // Run the demo each time the button is pressed. public void actionPerformed(ActionEvent evt) { Account account = new Account(INITIAL_BALANCE, currentBalanceLabel); ATM atm1 = new ATM(account, 100, depositTotalLabel); ATM atm2 = new ATM(account, -100, withdrawTotalLabel); } }
import javax.swing.JLabel; /* $Id: Account.java 2269 2013-12-01 02:33:37Z terescoj $ */ /** * A simple bank account. This one is safe for concurrent access by * adding the sychronized keyword as needed. * * @author original unknown * Updated for Java Swing, Jim Teresco, The College of Saint Rose, Fall 2013 */ public class Account { private int balance; private JLabel display; // label on screen for balance public Account(int start, JLabel aDisplay) { balance = start; display = aDisplay; display.setText("" + balance); } synchronized public int getBalance() { return balance; } synchronized public void changeBalance(int amount) { balance = balance + amount; display.setText("" + balance); // alternate: //int newBalance = balance + amount; //display.setText("" + newBalance); //balance = newBalance; } }