首页 > 技术文章 > 线程池的简单实用

a14907 2015-12-26 23:22 原文

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

 

 

 输出结果:

C# <wbr>线程池ThreadPool的用法

"End in Main"并没有在ThreadInvoke()方法中所有代码执行完之后才输出。

由此可见Main方法和ThreadInvoke是并行执行的。

 

2 使用线程池
上面介绍了只是一个最简单的有关线程线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上来讲,这样做并不理想(因为每使用一个线程就要创建一个,需要占用系统开销);从操作上来讲,每次都要启动,比较麻烦。为此引入的线程池的概念。
有关线程池的解释请参考:

http://www.cnblogs.com/JeffreyZhao/archive/2009/07/22/thread-pool-1-the-goal-and-the-clr-thread-pool.html


把上面的代码修改之后如下:

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

 

输出结果:

C# <wbr>线程池ThreadPool的用法

上面的代码把线程的创建和启动改为了ThreadPool.QueueUserWorkItem(newWaitCallback(ThreadInvoke)),方法ThreadInvoke加了个参数(Object param),并在Main结束之间加了Thread.Sleep(3000);Thread.Sleep(3000)这句话是必须的因为当Main方法结束后,.Net环境会自动结束销毁线程池,为了保证完成线程池里的任务,所以主线程需要等待一段时间。 

由输出结果可知,Main方法和ThreadInvoke方法是并行执行的。 

推荐阅读