⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bang.java

📁 利用多线程同步机制模拟银行帐号的存款取款操作
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestMain5 extends JFrame {
    private Accounts accounts = null; // 我的帐号
    private JTextField text = null; // 银行存款数额显示
    private JTextArea textArea = null; // 交易过程显示
    private JButton button = null; // 开始模拟交易的按钮
    public TestMain5(){
        super("银行存取模拟");
        accounts = new Accounts();
        text = new JTextField(Integer.toString(accounts.inquire()), 10); // 我们在银行中的初始存款为100
        textArea = new JTextArea();
        textArea.setText("交易信息:");
        JScrollPane sp = new JScrollPane(textArea);
        button = new JButton("开始交易");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                new Bank("钟楼支行", accounts, Bank.SAVE, 800);
                new Bank("高新支行", accounts, Bank.SAVE, 1300);
                new Bank("小寨支行", accounts, Bank.WITHDRAWAL, 200);
                new Bank("雁塔支行", accounts, Bank.WITHDRAWAL, 400);
                new Bank("兴庆支行", accounts, Bank.SAVE, 100);
                new Bank("土门支行", accounts, Bank.WITHDRAWAL, 700);
            }
        });
        JPanel pane = new JPanel();
        pane.add(text);
        pane.add(button);
        this.getContentPane().add(pane, BorderLayout.NORTH);
        this.getContentPane().add(sp);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(300, 200);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
   }
    
    /**
     * 银行交易大厅类
     * 一般银行都会有N个交易大厅,这些大厅可以同时处理多笔业务,这正好符合多线程的特点
     */
    class Bank extends Thread{
        /**
         * 静态字段:用于表示储存
         */
        public static final int SAVE = 0;
        /**
         * 静态字段:用于表示提取
         */
        public static final int WITHDRAWAL = 1;
        private int deal = Bank.WITHDRAWAL; // 默认使取款
        private int count = 0;
        private Accounts accounts = null; // 我的帐号
        /**
         * 构造这个银行交易大厅
         * name: 这个交易大厅的名称
         * Accounts: 我的银行帐号
         * deal: 行为,参考字段:SAVE或WITHDRAWAL
         * count: 钱的数量
         */
        public Bank(String name, Accounts accounts, int deal, int count){
            super(name);
            this.accounts = accounts;
            this.deal = deal;
            this.count = count;
            this.start();
        }
        public void run(){
            int counted = 0;
            if(deal == Bank.SAVE){ // 如果是存款业务
                counted = accounts.save(count);
            }else if(deal == Bank.WITHDRAWAL){ // 如果是取款业务
                counted = accounts.withdrawal(count);
            }
            text.setText(Integer.toString(counted));
            textArea.append("\n" + this.getName() + "   " + (deal == Bank.SAVE ? "存款": "取款") + "   金额:" + count + "    结余:" + counted);
        }
    }
    /**
     * 我的帐号
     * 进行同步测试
     */
    class Accounts{
        private Integer count = 100;
        public Accounts(){
        }
        /**
         * 查询我的帐号
         */
        public int inquire(){
            synchronized (count){
                return count;
            }
        }
        /**
         * 存款业务
         * @param c 存款的数量
         * @return 业务办理完成后的数量
         */
        public int save(int c){
            synchronized (count){
                //return count += c; // 为了能更好的观察,我们将这个简洁的语句注释掉
                int counted = inquire(); // 先查询帐户中的存款
                counted += c;
                try {
                    Thread.sleep(1000); // 为了更好的观察,使业务在此停顿1秒钟
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                count = counted; // 最后将总数储存起来
                return inquire(); // 返回最新的存款数
            }
        }
        /**
         * 取款业务
         * @param c 取款的数量
         * @return 业务办理完成后的数量
         */
        public int withdrawal(int c){
           synchronized (count){
                //return count -= c; // 为了能更好的观察,我们将这个简洁的语句注释掉
                int counted = inquire(); // 先查询帐户中的存款
                counted -= c;
                try {
                    Thread.sleep(1000); // 为了更好的观察,使业务在此停顿1秒钟
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                count = counted; // 最后将总数储存起来
                return inquire(); // 返回最新的存款数
            }
        }
    }
    
    public static void main(String [] args){
        new TestMain5();
    }
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -