一、代码练习————抢座系统
1.交互界面
2.代码部分
设置label1显示的文本信息,座位数量,我这里设置的座位数量是3个,最重要的是NEW一个锁(lock)避免多个对象同时抢同一个座位,造成出现座位数为负数的情况
编写抢票函数,运用锁来避免特殊情况(多个对象同时对一个座位进行抢夺)。
思路:用IF语句进行判断当前剩余座位数,当第一个对象进入系统时,启动锁来锁定系统,当他成功抢到座位时,座位数减一,并且输出抢座成功,反之输出抢座失败。
void GrabSeat()
{
lock(suo)
{
if (seat > 0)
{
Thread.Sleep(1000);
seat--;
//Console.WriteLine("抢座成功,当前座位数为:>{0}", seat);
Console.WriteLine(Thread.CurrentThread.Name + "抢座成功Success");
}
else
{
//Console.WriteLine("抢座失败,当前座位数为:>{0}", seat);
Console.WriteLine(Thread.CurrentThread.Name + "抢座失败Fail");
}
}
}
双击button1进入点击事件
设定10个人同时进行抢座,并且定义一个变量,能让我们清楚的知道那个对象抢到了座位。new了一个线程时,就必须要启动线程 thread.Start();
private void button1_Click(object sender, EventArgs e)
{
for (int i = 1; i < 11; i++)
{
int index = i;
Thread thread = new Thread(GrabSeat);
//Thread thread = new Thread(() =>
//{
// GrabSeat();
//});
thread.Name = "ID" + index.ToString();
thread.Start();
}
}
双击button2进入点击事件,用于显示label1的文本消息
private void button2_Click(object sender, EventArgs e)
{
label1.Text = "当前座位数:>" + seat.ToString();
}
二、线程的开启和关闭
定义两个按钮,一个用于开启线程,一个用于关闭线程,label的作用这是显示文本信息,便于让我们了解线程是否开启和关闭。
注意:其中的label数量是两个
生成一个点击事件,定义一个线程和一个布尔值,用于开启和关闭线程
本段代码为实现计数功能
因为此代码和上段代码是在同一个文件下编写的,所以线程数量不再是单独的一个,而button3中实现的功能虽然编写在子线程中,但是运行却是在主线程中,因此需要用到this.InvokeRequired来判断当前线程和我的主线程是否安全。
Thread thread;
bool flag = true;
private void button3_Click(object sender, EventArgs e)
{
int a = 0;
thread = new Thread(() =>
{
//直接写要执行的逻辑
while (flag)
{
a++;
//this.InvokeRequired判断当前线程和我的主线程是否安全
//如果是true不安全,反之
if (this.InvokeRequired)
{
//委托主线程帮忙修改
this.Invoke(new Action(() =>
{
label3.Text = a.ToString();
}));
//睡眠放到主线程里面会造成阻塞
Thread.Sleep(200);
}
else
{
label3.Text = a.ToString();
Thread.Sleep(200);
}
}
});
thread.Name = "我是子线程";
thread.Start();
}
button4用于关闭线程。
定义的布尔值bool flag = true;用于开启和关闭,当点击 button4时flag的值变为false,同时加入thread.Abort();使得线程能安全的关闭。
private void button4_Click(object sender, EventArgs e)
{
//关闭线程
//
flag = false;
thread.Abort();
}
三、问题解决
如果运行代码时没有出现调试框
解决方法
标签:抢座,Thread,thread,C#,void,-----------,线程,座位数 From: https://blog.csdn.net/m0_70785017/article/details/141680006