using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Runtime;
namespace Thread
{
class Program
{
static void Main(string[] args)
{
//把线程池的最大值设置为1000
ThreadPool.SetMaxThreads(1000, 1000);
ThreadMessage("Start");
//启动工作者线程
ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncCallback), "A");
ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncCallback), "B");
while (true) ;
}
private static object _lockQueue = new object();
public static void AsyncCallback(object state)
{
int i=0;
while (i < 20)
{
System.Threading.Thread.Sleep(1000);
Monitor.Enter(_lockQueue); //锁定,保持同步
ThreadMessage(state.ToString());
Console.Write("Async thread do work!" + i.ToString());
System.Threading.Thread.Sleep(100);
Console.WriteLine(state.ToString() );
i++;
Monitor.Exit(_lockQueue); //解锁
}
}
//显示线程现状
public static void ThreadMessage(string data)
{
string message = string.Format("id:{0} CurrentThreadId is {1}",
data, System.Threading.Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(message);
}
}
}
当某个线程在Monitor.Entry返回后就获得了对其中_lockQueue的访问权限,其他试图获取_lockQueue 的线程将被阻塞,直到线程调用Monitor.Exit释放_lockQueue 的所有权。这意味着下面三点:
如果_lockQueue 是空闲的,那么第一个调用Entry的线程将立即获得_lockQueue ;
如果调用Entry的线程已经获准访问_lockQueue ,那么不会阻塞;
如果调用Entry时_lockQueue 已被其他线程锁定,则线程等待直到_lockQueue 解锁;
bool b = Monitor.TryEnter(_lockQueue,200); //锁定 时间超出
if (b)
{
ThreadMessage(state.ToString());
Console.Write("Async thread do work!" + i.ToString());
System.Threading.Thread.Sleep(200);
Console.WriteLine(state.ToString());
i++;
}
if(b)
Monitor.Exit(_lockQueue); //解锁