多线程模拟取款


using System;
using System.Threading;
using System.Collections;
namespace MultiThreadLearn
{
internal class Account
{
int balance;
Random r = new Random();
internal Account(int initial)
{
balance = initial;
}
internal int Withdraw(int amount)
{
try
{
if (balance < 0)
{
throw new Exception("Negative Balance");
}
lock (this) //如果没有lock,可能会出现负值
{
Console.WriteLine("可用余额:" + balance);
if (balance >= amount)
{
balance = balance - amount;
Console.WriteLine("你已经取了:" + amount + ",可用余额为:" + balance + "。交易成功!");
Console.WriteLine();
return amount;
}
else
{
Console.WriteLine("你要取" + amount + "元,但是你的可用余额为" + balance + "。交易失败!");
Console.WriteLine();
return 0;
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return 0;
}
}
internal void DoTransactions()
{
for (int i = 0; i < 2; i++) //每个线程取两次款
{
int ri =r.Next(100,200);
Console.WriteLine("Current Thread:" + Thread.CurrentThread.Name);
Console.WriteLine("第"+(i+1)+"次交易");
Console.WriteLine("要取的金额是:"+ri);
Withdraw(ri);
}
}
}
internal class Test
{
static internal Thread[] threads = new Thread[10];
public static void Main2()
{
Account acc = new Account(700); //如果在初始化金额时,传了负值,会抛出异常,并输出
for (int i = 0; i < 3; i++)
{
Thread t = new Thread(new ThreadStart(acc.DoTransactions));
threads[i] = t;
}
threads[1].Priority = ThreadPriority.Highest;//如果不设,第一个输出的是线程0
for (int i = 0; i < 3; i++)
{
threads[i].Name = i.ToString();
}
for (int i = 0; i < 3; i++)
{
threads[i].Start();
}
Console.ReadLine();
}
}
}
如果本文的描述的方法或内容有问题,请给我留言。
分类:
多线程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述