Lock锁_线程_线程域
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Lock锁_线程_线程域
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// ThreadTest();1、单线程demo
//MoreThread();//2、多线程demo
// LockToMoreThread();//2、lock锁和多线程的使用
ThreadPoolOperation();//线程池的使用
}
#region 1、单线程的创建并使用
/// <summary>
/// 1、创建线程demo
/// </summary>
public void ThreadTest(){
//线程级别都是相等,主线程只是叫主线程,并不是它比其他线程牛逼
//新的参数不懂,一个是看定义,一个是拿着类型百度,还有就是试着new一个或者构造一下
// Thread t1 = new Thread(new ThreadStart(CreateString));//这里时委托,可以采用lambda,还可以其他各种写法,有4种
Thread t1 = new Thread(new ThreadStart(() => {
Console.WriteLine("消息:这 是为了测试线程输出1");
}));//再次记住,委托式是事件的壳
t1.IsBackground = true;//作为后台线程,要不然不会关闭
t1.Start();
int threadId= Thread.CurrentThread.ManagedThreadId;//获取当前线程的信息
Thread.Sleep(1000);//1秒,1000毫秒
t1.Join();//t1 线程阻塞
t1.Abort();//终止线程
}
public void CreateString()
{
Console.WriteLine("消息:这时为了测试线程输出");
}
#endregion
#region 2、多线程,lock的使用
public int AddInt = 0;//全局变量
public object objSync = new object();//锁的指标,每次针对一个不变,要声明一个,要引用类型的,不能是值类型的,这时利用引用类型的特性来操作的,值类型在操作的时候会发生复制,变化,引用类型堆中的数据没变
/// <summary>
/// 2、多线程操作影响变量,所以要使用lock,每次只能一个线程操作,防止多线程的错处
/// </summary>
public void MoreThread()
{
Thread t2 = new Thread(new ThreadStart(() =>
{
for (int i = 0; i <= 100; i++)
{
AddInt++;
}
}));
t2.IsBackground = true;
t2.Start();
Thread t3 = new Thread(new ThreadStart(() =>
{
for (int i = 100; i > 0; i--)
{
AddInt--;
}
}));
t3.IsBackground = true;
t3.Start();
Console.WriteLine("两个线程操作的结果:" + AddInt);//输出的结果没有一个确定的值,这时由于多个线程同时操作一个变量的结果,没有先后导致的
}
/// <summary>
/// lock锁结合多线程
/// </summary>
public void LockToMoreThread()
{
Thread t2 = new Thread(new ThreadStart(() =>
{
for (int i = 0; i <= 100; i++)
{
lock (objSync)
{
AddInt++;
}
}
}));
t2.IsBackground = true;
t2.Start();
Thread t3 = new Thread(new ThreadStart(() =>
{
for (int i = 100; i > 0; i--)
{
lock (objSync)
{
AddInt--;
}
}
}));
t3.IsBackground = true;
t3.Start();
Console.WriteLine("两个线程操作的结果:" + AddInt);//输出的结果没有一个确定的值,这时由于多个线程同时操作一个变量的结果,没有先后导致的
}
#endregion
#region 3、线程池的使用
/// <summary>
/// 线程池的操作,但是具体线程池掌握在系统手中,没有我们自己手动来创建的好用,有时候如果系统延迟,它的本质的系统自己根据实际情 ///况办的
///
/// </summary>
public void ThreadPoolOperation()
{
//往线程池中加入一个新线程执行方法
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{ //
for (int i = 0; i <= 100; i++)
{
lock (objSync)
{
AddInt++;
}
}
}));
//往线程池中加入第二个线程执行的方法
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{ //
for (int i = 100; i > 0; i--)
{
lock (objSync)
{
AddInt--;
}
}
}));
}
#endregion
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何统计不同电话号码的个数?—位图法
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· 用c#从头写一个AI agent,实现企业内部自然语言数据统计分析
· 三维装箱问题(3D Bin Packing Problem, 3D-BPP)
· Windows上,10分钟构建一个本地知识库
· Java虚拟机代码是如何一步一步变复杂且难以理解的?
· 凯亚物联网平台如何通过MQTT网络组件接入设备