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