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();//释放锁
}
}
}