Computer Science 120
Introduction to Programming
Fall 2011, Siena College
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.
/** * 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 */ import java.awt.*; import java.awt.event.*; import objectdraw.*; public class ATM extends ActiveObject { private Account account; private int change; // Amount of each transaction private Label info; // Where write description of transactions private int total = 0; // Store parameters and start running public ATM(Account anAccount, int aChange, Label aInfo) { account = anAccount; change = aChange; info = aInfo; start(); } // Repeatedly withdraw "change" from account at bank. public void run() { for (int i = 0; i < 10; i++) { account.changeBalance(change); total = total + change; info.setText("" + total); pause(400); } } }
/* $Id: Bank.java 1613 2011-04-28 04:02:39Z 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, Fall 2011 */ import java.awt.*; import java.awt.event.*; import objectdraw.*; public class Bank extends Controller implements ActionListener { private static final int INITIAL_BALANCE = 1000; // Initial balance in bank account private Label startBalance = new Label("Starting balance: " + INITIAL_BALANCE, Label.CENTER); private Label currentLabel = new Label("Current balance: ", Label.RIGHT); private Label currentBalanceLabel = new Label("" + INITIAL_BALANCE + " ", Label.LEFT); private Label withdrawLabel = new Label("Amount withdrawn: ", Label.RIGHT); private Label withdrawTotalLabel = new Label(" 0 ", Label.LEFT); private Label depositLabel = new Label("Amount deposited: ", Label.RIGHT); private Label depositTotalLabel = new Label(" 0 ", Label.LEFT); // Set up text area and two ATM threads public void begin() { setLayout(new GridLayout(0, 1)); this.setFont(new Font("System", Font.PLAIN, 18)); add(startBalance); Panel balancePanel = new Panel(); balancePanel.add(currentLabel); balancePanel.add(currentBalanceLabel); add(balancePanel); Panel withdrawPanel = new Panel(); withdrawPanel.add(withdrawLabel); withdrawPanel.add(withdrawTotalLabel); add(withdrawPanel); Panel depositPanel = new Panel(); depositPanel.add(depositLabel); depositPanel.add(depositTotalLabel); add(depositPanel); Panel buttonPanel = new Panel(); Button runIt = new Button("Run demo"); buttonPanel.add(runIt,"South"); add(buttonPanel); runIt.addActionListener(this); } // Rerun demo when 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 java.awt.*; /* $Id: Account.java 1613 2011-04-28 04:02:39Z terescoj $ */ /** * A Simple Bank Account. * * @author unknown */ public class Account { private int balance; private Label display; public Account(int start, Label aDisplay) { balance = start; display = aDisplay; } synchronized public int getBalance() { return balance; } synchronized public void changeBalance(int amount) { int newBalance = balance + amount; display.setText("" + newBalance); balance = newBalance; } }