题目描述
两个线程,一个线程取钱,一个线程存钱。
当余额不足时,取钱线程暂停取钱。
存钱线程存完钱后,唤醒取钱线程。
代码
使用ReentrantLock,和Condition的await,signal,signalAll
public class Demo {
volatile double money = 50;
Lock lock = new ReentrantLock(); // 新建一个Lock
Condition condition = lock.newCondition(); // new一个lock的condition
// 取钱
public void fitch() throws InterruptedException {
lock.lock(); // 获取锁
// 钱小于50,等待
while (money < 30) {
System.out.println("取 30:余额不足 = " + money);
condition.await();
}
money -= 30;
System.out.println("取 30:余额 = " + money);
Thread.sleep(3000); // 为了观看效果
lock.unlock(); // 释放锁
}
// 存钱
public void reserve() throws InterruptedException {
lock.lock(); // 获取锁
money += 30;
System.out.println("存 30:余额 = " + money);
Thread.sleep(3000); // 为了观看效果
condition.signalAll(); // 通知取钱线程
lock.unlock(); // 释放锁
Thread.sleep(5); // 为了更好的观看效果,睡5毫秒让取钱线程执行取钱操作
}
public static void main(String[] args) {
Demo demo = new Demo();
// 取钱线程
Thread fitch = new Thread(() -> {
for (int i = 0; i < 5; i++) {
try {
demo.fitch();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 存钱线程
Thread reserve = new Thread(() -> {
for (int i = 0; i < 5; i++) {
try {
demo.reserve();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
fitch.start();
reserve.start();
}
}