您好,欢迎访问一九零五行业门户网

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

多线程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怎么利用多线程模拟银行系统存钱问题的详细内容。
其它类似信息

推荐信息