用Python实现模拟从银行取钱,银行余额1000(设置公共变量balance=1000),每次取款时先判断余额是否充足,如果余额充足,则等待2-3秒后,开始取钱(从余额中减去取款金额即balance=balance-money,并打印取款成功及余额);如果余额不足,打印当前余额及取款金额,提示取款失败,余额不足。为了保证线程安全,需要对取款操作上锁保护。启动三个线程执行取钱操作,每个线程的取款金额为100至900之间的随机整数。
时间: 2024-03-06 07:51:42 浏览: 75
好的,下面是使用 Python 实现模拟从银行取钱的代码:
```python
import threading
import time
import random
balance = 1000 # 银行余额
# 取款方法
def withdraw(money):
global balance
# 对balance上锁
lock.acquire()
if balance >= money:
# 模拟取款需要2-3秒的时间
time.sleep(random.randint(2, 3))
balance -= money
print("取款成功,取出 %d 元,余额为 %d 元" % (money, balance))
else:
print("余额不足,取款失败,当前余额为 %d 元,取款金额为 %d 元" % (balance, money))
# 解锁
lock.release()
# 定义线程类
class WithdrawThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
global balance
while balance > 0:
# 从100到900之间随机取款金额
money = random.randint(100, 900)
withdraw(money)
# 创建锁对象
lock = threading.Lock()
# 创建三个线程并启动
t1 = WithdrawThread("Thread-1")
t2 = WithdrawThread("Thread-2")
t3 = WithdrawThread("Thread-3")
t1.start()
t2.start()
t3.start()
```
以上代码中,使用了全局变量 `balance` 来表示银行余额,并使用了 `threading.Lock()` 来创建了一个锁对象来保证线程安全。
在 `withdraw()` 方法中,使用了 `lock.acquire()` 和 `lock.release()` 来对 `balance` 上锁保护。如果余额充足,则等待 2-3 秒后取钱并更新余额,否则直接打印余额不足的提示信息。
在 `WithdrawThread` 类中重载了 `run()` 方法,每个线程会不断地从银行中取款,直到银行余额为 0。
最后,创建了三个线程并启动,模拟了三个用户不断地从银行中取款的过程。
阅读全文