C# 线程池ThreadPool的用法:
最近,因为做项目的关系,用到了很多和线程有关的东西。由于以前对线程只是有一个概括的了解,并没有深入的研究过,所以在面对一些问题时,总会感觉到有心无力,为此也花费了大量的时间和精力。为了巩固这方面的知识,特写此文章和大家分享。
1 最简单的线程例子
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Begin in Main");
Thread thread = new Thread(new ThreadStart(ThreadInvoke));
//启动线程
thread.Start();
//将当前线程挂起200毫秒
Thread.Sleep(200);
Console.WriteLine("End in Main");
}
static void ThreadInvoke()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Execute in ThreadInvoke");
//每隔100毫秒,循环一次
Thread.Sleep(100);
}
}
}
输出结果:
"End in Main"并没有在ThreadInvoke()方法中所有代码执行完之后才输出。
由此可见Main方法和ThreadInvoke是并行执行的。
2 使用线程池
上面介绍了只是一个最简单的有关线程线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上来讲,这样做并不理想(因为每使用一个线程就要创建一个,需要占用系统开销);从操作上来讲,每次都要启动,比较麻烦。为此引入的线程池的概念。
有关线程池的解释请参考:
把上面的代码修改之后如下:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Begin in Main");
//Thread thread = new Thread(new ThreadStart(ThreadInvoke));
////启动线程
//thread.Start();
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadInvoke));
//将当前线程挂起200毫秒
Thread.Sleep(200);
Console.WriteLine("End in Main");
Thread.Sleep(3000);
}
static void ThreadInvoke(Object param)
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Execute in ThreadInvoke");
//每隔100毫秒,循环一次
Thread.Sleep(100);
}
}
}
输出结果:
上面的代码把线程的创建和启动改为了ThreadPool.QueueUserWorkItem(newWaitCallback(ThreadInvoke)),方法ThreadInvoke加了个参数(Object param),并在Main结束之间加了Thread.Sleep(3000);Thread.Sleep(3000)这句话是必须的因为当Main方法结束后,.Net环境会自动结束销毁线程池,为了保证完成线程池里的任务,所以主线程需要等待一段时间。
由输出结果可知,Main方法和ThreadInvoke方法是并行执行的。
原文:http://www.cnblogs.com/a14907/p/5079285.html