模拟银行账户取钱问题
账户类
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Accout{
private Lock lock=new ReentrantLock(true);
private Condition am=lock.newCondition();
private int a=0;
public int geta() {
return a;
}
public void jia(int b)
{lock.lock();
a+=b;
System.out.println("存钱成功");
am.signalAll();//唤醒取钱失败的所有进程
lock.unlock();
}
public void jian(int b)
{lock.lock();
try {
while(a<b)
{System.out.println("余额不足,取钱失败");
am.await();}//余额不足,等待存钱进程执行完后在执行
a-=b;
System.out.println("取钱成功");
}
catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
lock.unlock();
}
}
在这里插入代码片
取钱线程类
public class B implements Runnable{
private Accout a;
private int b;
public B(Accout a,int b)
{this.a=a;
this.b=b;}
public void run() {
a.jian(b);
}
}
在这里插入代码片
存钱线程类
public class A implements Runnable{
private Accout a;
private int b;
public A(Accout a,int b)
{this.a=a;
this.b=b;}
public void run() {
a.jia(b);
}
}
在这里插入代码片
测试类
public class my {
static Accout a=new Accout();
public static void main(String []args) {
ExecutorService am=Executors.newFixedThreadPool(3);
am.execute(new A(a,20));
am.execute(new B(a,30));
am.shutdown();
}}
在这里插入代码片
测试结果