Java多线程经典例题之二--银行
来源:互联网 发布:郁金香运动 知乎 编辑:程序博客网 时间:2024/06/15 07:04
银行帐户的存取款线程设计。
本例设计四个类,银行帐户类Account、存款线程类Deposit和取款线程类Withdraw,以及一个测试类AccountTest。
首先对银行账户进行定义,其中我们应该将属性定义为私有加以封装,由于此题主要是为了实现同步线程,所以设计太过于详细的要求你,只是简单的设计了用户和余额。
银行用户类:
public class Account {//账号private String account;//余额private double amount;public Account() {// TODO Auto-generated constructor stub}public Account(String account, double amount) {super();this.account = account;this.amount = amount;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}}
存钱类:
/** * 存钱线程 * * * @author 睿源 * */public class Deposit extends Thread{//定义账号(余额)Account account;public Deposit(Account account) {super();this.account = account;}@Overridepublic void run() {while(true){//这里是入口,但是有锁,你得拿到钥匙才能进去synchronized (account) {//每次存1000以内的金额//余额要等于原来的余额+每次存的金额int random = (int)(Math.random()*1000)+1;account.setAmount(account.getAmount()+random);account.notify();System.out.println(Thread.currentThread().getName()+":存款金额是:"+random+",当前余额是:"+account.getAmount());try {Thread.sleep(2000);} catch (InterruptedException e) {}}//方法结束后,就释放锁}}}
取钱类:
public class Withdraw extends Thread{Account account;public Withdraw(Account account) {super();this.account = account;}@Overridepublic void run() {while(true){synchronized (account) {int random = (int)(Math.random()*1000)+1;//如果要取出的金额大于账户的余额if(random > account.getAmount()){try {System.out.println(Thread.currentThread().getName()+":您要取:"+random+",但是您的余额不足!您的余额是:"+account.getAmount());account.wait();} catch (InterruptedException e) {}}else{//执行取钱操作account.setAmount(account.getAmount()-random);System.out.println(Thread.currentThread().getName()+":取现金额是"+random+",余额是:"+account.getAmount());}}}}}
测试类:
public class AccountTest {public static void main(String[] args) {Account account = new Account();Thread deposit = new Deposit(account);Thread withdraw = new Withdraw(account);deposit.setName("存钱");withdraw.setName("取钱");deposit.start();withdraw.start();}}
运行结果如下:
存钱:存款金额是:211,当前余额是:211.0
取钱:您要取:246,但是您的余额不足!您的余额是:211.0
存钱:存款金额是:968,当前余额是:1179.0
存钱:存款金额是:105,当前余额是:1284.0
存钱:存款金额是:119,当前余额是:1403.0
取钱:取现金额是58,余额是:1345.0
存钱:存款金额是:219,当前余额是:1564.0
取钱:取现金额是275,余额是:1289.0
取钱:取现金额是457,余额是:832.0
取钱:取现金额是67,余额是:765.0
取钱:取现金额是502,余额是:263.0
取钱:您要取:815,但是您的余额不足!您的余额是:263.0
存钱:存款金额是:402,当前余额是:665.0
Synchronized锁定一段代码,称为创建一个代码临界区,使得线程必须等候特定资源的所有权。
当第一个线程执行这段代码时,它获取特定的对象的所有权,即拥有该对象的锁。此时,如果有第二个线程对同一个对象也要执行这段代码时,它试图获取该对象的所有权,但因该对象已被锁定,则第二个线程必须等待,直到锁被释放为止。第一个线程执行完<语句>后,自动释放了锁,接下去第二个线程获得锁并可运行。这样就形成了多个线程对同一个对象的“互斥”使用方式,该对象称为“同步对象”。这种锁定方式是针对某个特定对象而言的。如果有两个线程同时对两个不同的对象进行操作,则没有锁定,它们可以同时进入代码的临界区。
- Java多线程经典例题之二--银行
- Java多线程经典例题一
- Java中的多线程—经典例题
- Java经典例题之汉诺塔<递归实现>
- C经典例题二
- Java经典例题!
- java经典例题
- java 经典算法 例题
- Java多线程银行取款
- Java基础——银行例题
- Java多线程之二
- java 多线程基础之银行取号排队系统
- java 多线程基础之银行取号排队系统
- Java经典算法例题分享
- Java经典算法例题分享
- 学习java的经典例题
- Java程序员笔试经典例题
- java--------动态的经典例题
- Ubuntu下Cmake的安装以及Cmake的使用
- 常用5种设计模式介绍
- 注解(Annotation)自定义注解入门
- linux基础之第三方yum源的搭建
- python学习笔记(一)HelloWorld:从零开始学一门编程语言
- Java多线程经典例题之二--银行
- 关键字: 抽象类与接口的区别
- 奇异值分解(SVD)
- 离散数学集合部分错题分析(续)
- c++之递归小程序
- poj 1755 (半平面交解不等式)
- loadrunner一个脚本添加多台负载机器的两种方法
- hdu1081 To the Max
- Linxu程序内部嵌入shell终端指令并获取该指令的输出结果