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
}
}

原文地址:https://www.cnblogs.com/linbin524/p/4767029.html