我想知道在C#中,线程和线程池到底在应用上有什么区别,什么情况下必须用线程池才能完成,请给出有关线程和线程池的概念、应用、示例的相关资料,谢谢

解决方案 »

  1.   

    线程:
    线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作。线程池:
    线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。如果需要使一个任务具有特定优先级或者需要将线程放置到单线程单元中(线程池中的线程均处于多线程单元中)最好不要使用线程池线程池示例:// ThreadPool.cs
      // 线程池示例
      using System;
      using System.Threading;
      public class Test 
      {
      // 存放要计算的数值的字段
      static double number1 = -1;
      static double number2 = -1;
      public static void Main() 
      {
      // 获取线程池的最大线程数和维护的最小空闲线程数
      int maxThreadNum, portThreadNum;
      int minThreadNum;
      ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
      ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
      Console.WriteLine("最大线程数:", maxThreadNum);
      Console.WriteLine("最小空闲线程数:", minThreadNum);
      // 函数变量值
      int x = 15600;
      // 启动第一个任务:计算x的8次方
      Console.WriteLine("启动第一个任务:计算的8次方。", x);
      ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
      // 启动第二个任务:计算x的8次方根
      Console.WriteLine("启动第二个任务:计算的8次方根。", x);
      ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);
      // 等待,直到两个数值都完成计算
      while (number1 == -1 || number2 == -1) ;
      // 打印计算结果
      Console.WriteLine("y() = ", x, number1 + number2);
      }
      // 启动第一个任务:计算x的8次方
      static void TaskProc1(object o) 
      {
      number1 = Math.Pow(Convert.ToDouble(o), 8);
      }
      // 启动第二个任务:计算x的8次方根
      static void TaskProc2(object o)
      {
      number2 = Math.Pow(Convert.ToDouble(o), 1.0 / 8.0);
      }
      }
      

  2.   

    线程池中的线程由系统进行管理,不需要于线程管理,可以集中精力处理应用程序任务。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间之后创建另一个辅助线程。但线程的数目永远不会超过最大值。超过最大值的其他线程可以排队,但它们要等到其他线程完成后才启动。线程池特别适合于执行一些需要多个线程的任务。使用线程池能够优化这些任务的执行过程,从而提高吞吐量,它不仅能够使系统针对此进程优化该执行过程,而且还能够使系统针对计算机上的其他进程优化该执行过程。如果需要启动多个不同的任务,而不想分别设置每个线程的属性,则可以使用线程池。using System;
    using System.Threading;
    public class Test 
    {
        static double number1 = -1;
        static double number2 = -1;
        public static void Main() 
        {
            int maxThreadNum, portThreadNum;
            int minThreadNum;
            ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
            ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
            Console.WriteLine("最大线程数:{0}", maxThreadNum);
            Console.WriteLine("最小空闲线程数:{0}", minThreadNum);
            int x = 1600;
            Console.WriteLine("启动第一个任务", x);
            ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);        Console.WriteLine("启动第二个任务", x);
            ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);
            while (number1 == -1 || number2 == -1) ;
            Console.WriteLine("y({0}) = {1}", x, number1 + number2);    }
        static void TaskProc1(object o) 
        {
            number1 = Math.Pow(Convert.ToDouble(o), 6);
        }    static void TaskProc2(object o)
        {        number2 = Math.Pow(Convert.ToDouble(o), 1.0 / 6.0);
        }}参考
      

  3.   

    http://www.cnblogs.com/peterzb/archive/2009/06/10/1500273.html
    里面很详细,建议看完!
      

  4.   

    线程池的作用是什么作用是减小线程创建和销毁的开销创建线程涉及用户模式和内核模式的切换,内存分配,dll通知等一系列过程,线程销毁的步骤也是开销很大的,所以如果应用程序使用了完一个线程,我们能把线程暂时存放起来,以备下次使用,就可以减小这些开销所有进程使用一个共享的线程池,还是每个进程使用独立的线程池?每个进程都有一个线程池,一个Process中只能有一个实例,它在各个应用程序域(AppDomain)是共享的,.Net2.0 中默认线程池的大小为工作线程25个,IO线程1000个,有一个比较普遍的误解是线程池中会有1000个线程等着你去取,其实不然, ThreadPool仅仅保留相当少的线程,保留的线程可以用SetMinThread这个方法来设置,当程序的某个地方需要创建一个线程来完成工作时,而线程池中又没有空闲线程时,线程池就会负责创建这个线程,并且在调用完毕后,不会立刻销毁,而是把他放在池子里,预备下次使用,同时如果线程超过一定时间没有被使用,线程池将会回收线程,所以线程池里存在的线程数实际是个动态的过程