1.线程同步:
研究对象: 来自Thread类的构造器委托参数
1.1 没有参数且无返回值的委托,代码实例:
Thread threadStart=new Thread(new ThreadStart(
()=>
{
for(var i=0;i<1000000;i++)
{
Console.WriteLine(“后台线程计数”+i);
}
}));
threadStart.IsBackground=true;
threadStart.Start();
1.2带有参数但无返回值的委托,代码实例:
Thread parametThreadStart=new Thread(new ParameterizedThreadStart((object obj)=>
{
for(var i=0;i<(int)obj;i++)
{
Console.WriteLine(“后台线程计数”+i);
Thread.Sleep(100);
}
}));
parametThreadStart.IsBackground=true;
parametThreadStart.Start(1000);
2.线程异步:(对于有参数又有返回值的委托,用new Thread()就不行了改用异步就可以实现)
研究对象:有参数又有返回值的委托,代码实例:
public delegate string MethodCaller(string name);
public static void Main(string[] args)
{
MethodCaller mc = new MethodCaller(GetName);
string name = “zhangsan”;
IAsyncResult result = mc.BeginInvoke(name, null, null);//异步
string myname = mc.EndInvoke(result);//接收返回值
Console.WriteLine(myname);
}
public static string GetName(string name)
{
return name;
}
3.多线程资源共享带来的数据紊乱问题:(解决办法)
方法:采用.NET悲观锁lock的方式
实例代码:
BookShop book = new BookShop();
Thread parametThreadStart1 = new Thread(book.Sale);
Thread parametThreadStart2 = new Thread(book.Sale);
parametThreadStart1.Start();
parametThreadStart2.Start();
class BookShop
{
public int num = 1;
private static readonly object oLock = new object();
public void Sale()//参数:剩余图书数量
{
lock (oLock)
{
int tmp = num;
if (tmp > 0)
{
Thread.Sleep(1000);
num -= 1;
Console.WriteLine("售出一本书,还剩余{0}本", num);
}
else
{
Console.WriteLine("没有了");
}
}
}
}
代码运行结果:(分两种)
a.带lock
售出一本书,还剩余0本
没有了
b.不带lock
售出一本书,还剩余0本
售出一本书,还剩余-1本