Java利用多线程模拟银行系统存钱问题

目录
  • 多线程6(模拟银行系统存钱)
    • 1.题目
    • 2.解题思路
    • 3.代码详解

多线程6(模拟银行系统存钱)

1.题目

模拟一个简单的银行系统,使用两个不同的线程向同一个账户存钱。

实现:使用synchronized关键字,将存钱的方法修改成同步的。

2.解题思路

创建一个类:SynchronizedBankFrame,继承JFrame类

写一个内部类Bank

  • 定义一个account变量,来表示账户。
  • deposit():一个存钱的方法
  • getAccount():显示账户余额的方法。

写一个内部类Transfer,实现Runnable接口

在run方法中实现向账户存钱的功能。

同步方法就是用synchronized关键字修饰的方法。

JDK为每个JAVA对象配置了内置锁,如果方法使用synchronized关键字修饰,内置锁就会保护整个方法。

3.代码详解

SynchronizedBankFrame

package com.xiaoxuzhu;
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Font;
import javax.swing.UIManager;
/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/14.1	    xiaoxuzhu		2022/5/14		    Create
 * </pre>
 * @date 2022/5/14
 */

public class SynchronizedBankFrame extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 2671056183299397274L;
    private JPanel contentPane;
    private JTextArea thread1TextArea;
    private JTextArea thread2TextArea;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    SynchronizedBankFrame frame = new SynchronizedBankFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public SynchronizedBankFrame() {
        setTitle("使用Synchronized实现线程同步");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        JPanel buttonPanel = new JPanel();
        contentPane.add(buttonPanel, BorderLayout.SOUTH);

        JButton startButton = new JButton("开始存钱");
        startButton.setFont(new Font("微软雅黑", Font.PLAIN, 16));
        startButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                do_button_actionPerformed(arg0);
            }
        });
        buttonPanel.add(startButton);

        JPanel processPanel = new JPanel();
        contentPane.add(processPanel, BorderLayout.CENTER);
        processPanel.setLayout(new GridLayout(1, 2, 5, 5));

        JPanel thread1Panel = new JPanel();
        processPanel.add(thread1Panel);
        thread1Panel.setLayout(new BorderLayout(0, 0));

        JLabel thread1Label = new JLabel("一号线程");
        thread1Label.setFont(new Font("微软雅黑", Font.PLAIN, 16));
        thread1Label.setHorizontalAlignment(SwingConstants.CENTER);
        thread1Panel.add(thread1Label, BorderLayout.NORTH);

        JScrollPane thread1ScrollPane = new JScrollPane();
        thread1Panel.add(thread1ScrollPane, BorderLayout.CENTER);

        thread1TextArea = new JTextArea();
        thread1TextArea.setFont(new Font("微软雅黑", Font.PLAIN, 16));
        thread1ScrollPane.setViewportView(thread1TextArea);

        JPanel thread2Panel = new JPanel();
        processPanel.add(thread2Panel);
        thread2Panel.setLayout(new BorderLayout(0, 0));

        JLabel thread2Label = new JLabel("二号线程");
        thread2Label.setFont(new Font("微软雅黑", Font.PLAIN, 16));
        thread2Label.setHorizontalAlignment(SwingConstants.CENTER);
        thread2Panel.add(thread2Label, BorderLayout.NORTH);

        JScrollPane thread2ScrollPane = new JScrollPane();
        thread2Panel.add(thread2ScrollPane, BorderLayout.CENTER);

        thread2TextArea = new JTextArea();
        thread2TextArea.setFont(new Font("微软雅黑", Font.PLAIN, 16));
        thread2ScrollPane.setViewportView(thread2TextArea);
    }

    protected void do_button_actionPerformed(ActionEvent arg0) {
        Bank bank = new Bank();
        Thread thread1 = new Thread(new Transfer(bank, thread1TextArea));
        thread1.start();
        Thread thread2 = new Thread(new Transfer(bank, thread2TextArea));
        thread2.start();
    }

    private class Transfer implements Runnable {
        private Bank bank;
        private JTextArea textArea;

        public Transfer(Bank bank, JTextArea textArea) {// 初始化变量
            this.bank = bank;
            this.textArea = textArea;
        }

        public void run() {
            for (int i = 0; i < 10; i++) {// 向账户中存入10次钱
                bank.deposit(10);// 向账户中存入10块钱
                String text = textArea.getText();// 获得文本域中的文本
                // 在文本域中显示账户中的余额
                textArea.setText(text + "账户的余额是:" + bank.getAccount() + "\n");
            }
        }
    }

    private class Bank {
        private int account = 100;// 每个账户的初始金额是100元

        public synchronized void deposit(int money) {// 向账户中存入money元
            account += money;
        }

        public int getAccount() {// 查询账户余额
            return account;
        }
    }

}

到此这篇关于Java利用多线程模拟银行系统存钱问题的文章就介绍到这了,更多相关Java多线程银行存钱内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java多线程解决龟兔赛跑问题详解

    目录 多线程4(龟兔赛跑-休眠线程) 1.题目 2.解题思路 3.代码详解 多线程4(龟兔赛跑-休眠线程) 1.题目 在龟兔赛跑中,领先的兔子因为通宵写博客,中途太累睡着了,跑输了乌龟.这个故事说明了兔子是爱学习的同学.咳咳,通宵是不可取的,大家别学. 实现:使用线程休眠模拟龟兔赛跑比赛 2.解题思路 创建一个类:RaceFrame,继承了JFrame.用来界面显示两个文本区域,用来输出乌龟和兔子的比赛记录,比赛开始按钮用来开始比赛. 编写内部类:Rabbit,该类实现了Runnable接口,在

  • 以银行取钱为例模拟Java多线程同步问题完整代码

    简单了解下在操作系统中进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行.首先存钱取钱的这个操作,应该是线程操作的

  • Java利用多线程模拟银行系统存钱问题

    目录 多线程6(模拟银行系统存钱) 1.题目 2.解题思路 3.代码详解 多线程6(模拟银行系统存钱) 1.题目 模拟一个简单的银行系统,使用两个不同的线程向同一个账户存钱. 实现:使用synchronized关键字,将存钱的方法修改成同步的. 2.解题思路 创建一个类:SynchronizedBankFrame,继承JFrame类 写一个内部类Bank 定义一个account变量,来表示账户. deposit():一个存钱的方法 getAccount():显示账户余额的方法. 写一个内部类Tr

  • Java多线程模拟银行系统存钱问题详解

    目录 一.题目描述 二.解题思路 三.代码详解 多学一个知识点 一.题目描述 题目:模拟一个简单的银行系统,使用两个不同的线程向同一个账户存钱. 实现:使用特殊域变量volatile实现同步. 二.解题思路 创建一个类:SynchronizedBankFrame,继承JFrame类 写一个内部类Bank 定义一个account变量,来表示账户. deposit():一个存钱的方法 getAccount():显示账户余额的方法. 写一个内部类Transfer,实现Runnable接口 在run方法

  • Java实现多线程模拟龟兔赛跑

    Java多线程模拟龟兔赛跑,供大家参考,具体内容如下 笔者利用Java多线程技术,将兔子和乌龟的跑步以两个线程的方式模拟出来,以达到一个初步的效果. 题目如下:路程总距离为35米 兔子:每秒跑5米,每跑10米,休息2秒: 乌龟:每秒跑3米,不休息. 所用工具 JDK1.8+IntelliJ IDEA 2020.1 代码 Race.java:(线程类,通过new出来的对象的不同线程名,然后分别模拟兔子和乌龟的跑步) package task; import org.omg.Messaging.SY

  • java利用多线程和Socket实现猜拳游戏

    本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下 实例:猜拳游戏 猜拳游戏是指小时候玩的石头.剪刀.布的游戏.客户端与服务器的"较量",服务器会自动随机产生出石头.剪刀或者布,客户端则由用户输入石头.剪刀.布之一,然后服务器通过比较告知比较结果.比如,客户端出石头,而服务器出的是剪刀,那么,服务器就会告知客户端,用户赢了.猜拳游戏也要制作一个多线程的程序,让多个客户端能够共同参与游戏.在该程序中,要包括猜拳的业务逻辑的线程类.客户端类.服务器

  • Java利用HttpClient模拟POST表单操作应用及注意事项

    HttpClient使用post方法提交数据 源代码: 复制代码 代码如下: package post; import Java.io.IOException; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commo

  • java多线程模拟交通灯管理系统

    本文实例为大家分享了java多线程模拟交通灯管理系统的具体代码,供大家参考,具体内容如下 一.项目业务逻辑分析 项目需求:模拟实现十字路口的交通灯管理系统逻辑,要求如下: 异步随机生成按照各个路线行驶的车辆,例如由北向南行驶的车辆.由东向南行驶的车辆. 信号灯忽略黄灯,只考虑红灯和绿灯的情况. 左转受信号灯控制,右转车辆不受信号灯控制,其他情况与现实生活的逻辑相同. 注:南北向车辆和东西向方向车辆交替放行,同方向等待车辆应先放行直行车辆,而后再放行左转车辆. 每辆车通过路口所需时间为1秒(提示:

  • Java利用future及时获取多线程运行结果

    Future接口是Java标准API的一部分,在java.util.concurrent包中.Future接口是Java线程Future模式的实现,可以来进行异步计算. 有了Future就可以进行三段式的编程了,1.启动多线程任务2.处理其他事3.收集多线程任务结果.从而实现了非阻塞的任务调用.在途中遇到一个问题,那就是虽然能异步获取结果,但是Future的结果需要通过isdone来判断是否有结果,或者使用get()函数来阻塞式获取执行结果.这样就不能实时跟踪其他线程的结果状态了,所以直接使用g

  • java多线程模拟抢红包功能

    今天有朋友问我一道面试题,有5个人抢5个红包,可重复抢,用多线程程序实现,实现方式有多种,分享一下我的思路:应用了阻塞队列的特性. /** * Created by zhanglinqiang on 2016/6/23. */ public class MyTest { public static void main(String[] args) throws InterruptedException { LinkedBlockingQueue<LuckyMoney> luckyMoneys

  • Java多线程模拟电影售票过程

    用多线程模拟电影售票过程(Java实训) 实训目的: 多线程的实现.线程同步 实训要求: 总票数和售票窗口数由键盘输入,用每个线程处理一个窗口的售票. Test.java package program5; import java.util.Scanner; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(S

  • Java实战之多线程模拟站点售票

    一.实验题目 二.分析 哦吼,这次的实验题目是一道非常经典的多线程买票问题.题目要求我们创建5个线程来模拟卖票,当然这其中就包含多线程存在也就是我们要解决的问题,重复卖票和超额卖票.即多个窗口卖出同一张票以及窗口卖出非正数编号的票. 不过这个问题可以先放一下,我们先来创建基础的线程模型,并在主方法中创建五个线程让他们跑起来: 话不多说,上代码. public class Ticket { public static void main(String[] args) { for(int i = 1

随机推荐