ConditionTest 模拟存款与取款的操作通过Lock枷锁

package com.java.basis.threads;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ConditionTest {
	public static void main(String[] args) {
		ConditionTest test = new ConditionTest();
		//实例化UserAccount
		UserAccount userAccount=test.new UserAccount("62212100105985485","fliay",4000);
		//创建线程池
		ExecutorService pool=Executors.newFixedThreadPool(2);
		Thread t1=test.new getting("62212100105985485","张三1",500,userAccount);
		Thread t2=test.new getting("62212100105985485","张三2",1500,userAccount);
		Thread t3=test.new saveing("62212100105985485","张三3",2500,userAccount);
		Thread t4=test.new getting("62212100105985485","张三4",300,userAccount);
		Thread t5=test.new saveing("62212100105985485","张三5",1100,userAccount);
		Thread t6=test.new getting("62212100105985485","张三6",3400,userAccount);
		Thread t7=test.new saveing("62212100105985485","张三7",4400,userAccount);
		Thread t8=test.new getting("62212100105985485","张三8",700,userAccount);
		Thread t9=test.new saveing("62212100105985485","张三9",2200,userAccount);
		pool.execute(t1);
		pool.execute(t2);
		pool.execute(t3);
		pool.execute(t4);
		pool.execute(t5);
		pool.execute(t6);
		pool.execute(t7);
		pool.execute(t8);
		pool.execute(t9);
		
		pool.shutdown();

	}

	
	
	//取款线程
	public class getting extends Thread{
		private String accountId;
		private String name;
		private int get;
		private UserAccount userAccount ;
		public getting(String accountId,String name,int get,UserAccount userAccount){
			this.accountId=accountId;
			this.name=name;
			this.get=get;
			this.userAccount=userAccount;
		}
		
		
		@Override
		public void run() {
			userAccount.getting(get, accountId, name);;
		}
	}
	//存款线程
		public class saveing extends Thread{
			private String accountId;
			private String name;
			private int get;
			private UserAccount userAccount ;
			public saveing(String accountId,String name,int get,UserAccount userAccount){
				this.accountId=accountId;
				this.name=name;
				this.get=get;
				this.userAccount=userAccount;
			}
			
			
			@Override
			public void run() {
				userAccount.saveing(get, accountId, name);;
			}
		}
		
	
	/**
	 * 用户的账户信息
	 * @author fliay
	 *
	 */
	public class UserAccount {
		private String accountId;
		private String name;
		private int money;//账户内的金额
		Lock lock = new ReentrantLock();
		Condition saveMoney = lock.newCondition();//创建取款的线程
		Condition getMoney = lock.newCondition();//创建存款的线程
		
		public UserAccount(String accountId,String name,int money){
			this.accountId=accountId;
			this.name=name;
			this.money=money;
		}
		
	
		/**
		 * 存款
		 * @param save
		 * @param accountId
		 * @param name
		 */
		public void saveing(int save,String accountId,String name){
			//对当前存款进行枷锁
			lock.lock();
			if(save>0){
				money+=save;//存款
				System.out.println("用户【"+name+"】往账户:"+accountId+"存款:"+save+"元,余额为+"+money);
			}else{
				System.out.println("用户【"+name+"】往账户:"+accountId+"存款失败");
			}
			saveMoney.signalAll();//唤醒所有等待的线程
			lock.unlock();//释放锁
			
		}
		
		/**
		 * 取款
		 * @param get
		 * @param accountId
		 * @param name
		 */
		public void getting(int get,String accountId,String name){
			//对当前存款进行枷锁
			lock.lock();
			if(get>money){
				System.out.println("用户【"+name+"】从账户:"+accountId+"取款"+get+"元"+"取款失败,账户余额为"+money+"元!");
			}else{
				money-=get;
				System.out.println("用户【"+name+"】从账户:"+accountId+"取款"+get+"元"+"取款成功,账户余额为"+money+"元!");
			}
			getMoney.signalAll();//唤醒所有等待的线程
			lock.unlock();//释放锁
			
		}
		

	}

}

  

posted @ 2016-10-14 10:45  fliay  阅读(123)  评论(0)    收藏  举报