`
sd6292766
  • 浏览: 100270 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA多线程的一个复习例子(取款同步)(希望大家不要看源代码,看题目自己写出实现)

阅读更多
    目的:练习JAVA多线程锁的机制。
     题目要求:假设某银行服务器内存储了1000块钱的数据信息,现有两台ATM同时取款,一个取800,一个取700,用多线程解决同时取款的问题

























这里贴出我写的源代码(其实是网上资料,自己复习用)
   
        /**
 * 银行账户类
 * @author 刘峰
 *
 */
public class Account {
	
	private float balance = 1000;

	public float getBalance() {
		return balance;
	}

	public void setBalance(float balance) {
		this.balance = balance;
	}
	
	/**
	 * 取款(同步)
	 * @param money
	 * author by 刘峰
	 * 2010-6-21下午04:43:45
	 */
	public synchronized void withdraw(float money){
		if(balance >= money){
			System.out.println("被取走"+money+"元");
			
			try{
				Thread.sleep(1000);

			}catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            }

			//扣钱
			balance -= money;
		}else{
			System.out.println("对不起,余额不足!");
		}
		
	}
}
 


/**
 * ATM1
 * @author 刘峰
 *
 */
public class TestAccount1 extends Thread {
	private Account account;

	public TestAccount1(Account account){
		this.account = account;
	}
	public Account getAccount() {
		return account;
	}

	public void setAccount(Account account) {
		this.account = account;
	}
	
	public void run(){
		System.out.println(this.getName() + "来取"+800+"块钱");
		account.withdraw(800);
		System.out.println("余额为:" + account.getBalance() + "元!");
	}
	
	
}


    /**
 * ATM2
 * @author 刘峰
 *
 */
public class TestAccount2 extends Thread {
	
	private Account account;

	public TestAccount2(Account account){
		this.account = account;
	}
	
	public Account getAccount() {
		return account;
	}

	public void setAccount(Account account) {
		this.account = account;
	}
	
	public void run(){
		System.out.println(this.getName() + "来取"+700+"块钱");
		account.withdraw(700);
		System.out.println("余额为:" + account.getBalance() + "元!");
	}
	

}




测试:
public class Test {

	/**
	 * @param args
	 * author by 刘峰
	 * 2010-6-21下午04:55:11
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Account account = new Account();
		TestAccount1 acc1 = new TestAccount1(account);
		TestAccount2 acc2 = new TestAccount2(account);
		acc1.start();
		acc2.start();
	}

}




输出到控制台的信息:

    Thread-0来取800块钱
    Thread-1来取700块钱
    被取走700.0元
    对不起,余额不足!
    余额为:300.0元!
    余额为:300.0元!

如果大家觉得两个线程不够用的话,可在上面代码优化,方便理解JAVA线程



分享到:
评论
3 楼 sd6292766 2013-05-14  
ribavnu 写道
线程锁。
求楼主继续霸气啊,来个把钱存到数据库的,然后数据库实现存取的。

JDBC自己学着弄吧。不放心的话,可以用HIBERNATE,用乐观锁控制下。复杂点的,做成异步去处理。第二个线程进去,一定会查看到最新信息。
2 楼 ribavnu 2013-05-10  
线程锁。
求楼主继续霸气啊,来个把钱存到数据库的,然后数据库实现存取的。
1 楼 eddie_520 2012-09-20  
                                                                    
必须的,这帖子,学知识!

相关推荐

Global site tag (gtag.js) - Google Analytics