如题,是一个面试题,用thread pool有什么好处,有什么坏处?

解决方案 »

  1.   

    //ThreadPool目标是为了减除线程的初始化开销,实现并行处理。.NET类库中的ThreadPool是异步IO的基础,比如,在System.Net.Socket中,我们可以使用BeginAccept , EndAccept将Socket需要阻塞的操作放到系统的线程池中运行,而在执行结束以后通知主线程。
    //我们的程序中使用ThreadPool来进行一些比较耗时或者需要阻塞的操作。当学要复杂的同步技术,例如事件,或需要对一个现场表调用Join方法时线程池就不能满足需求了.在以下情况中不宜使用ThreadPool而应该使用单独的Thread:
    //1,需要为线程指定详细的优先级
    //2,线程执行需要很长时间
    //3,需要把线程放在单独的线程apartment中
    //4,在线程执行中需要对线程操作,如打断,挂起等。搜来的,呵呵~
      

  2.   

    许多应用程序创建的线程都要在休眠状态中消耗大量时间,以等待事件发生。其他线程可能进入休眠状态,只被定期唤醒以轮询更改或更新状态信息。线程池通过为应用程序提供一个由系统管理的辅助线程池使您可以更为有效地使用线程。一个线程监视排到线程池的若干个等待操作的状态。当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数。托管线程池中的线程为后台线程,即它们的 IsBackground 属性为 true。这意味着在所有的前台线程都已退出后,ThreadPool 线程不会让应用程序保持运行。
     也可以将与等待操作不相关的工作项排列到线程池。若要请求由线程池中的一个线程来处理工作项,请调用 QueueUserWorkItem 方法。此方法将对将被从线程池中选定的线程调用的方法或委托的引用用作参数。一个工作项排入队列后就无法再取消它。计时器队列中的计时器以及已注册的等待操作也使用线程池。它们的回调函数也会排列到线程池。每个进程都有一个线程池。线程池的默认大小为每个可用处理器有 25 个线程。使用 SetMaxThreads 方法可以更改线程池中的线程数。每个线程使用默认的堆栈大小并按照默认的优先级运行。
      

  3.   

    ThreadPool的例子:using System;
    using System.Threading;
    public class Example {
        public static void Main() {
            // Queue the task.
            ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
            
            Console.WriteLine("Main thread does some work, then sleeps.");
            // If you comment out the Sleep, the main thread exits before
            // the thread pool task runs.  The thread pool uses background
            // threads, which do not keep the application running.  (This
            // is a simple example of a race condition.)
            Thread.Sleep(1000);        Console.WriteLine("Main thread exits.");
        }    // This thread procedure performs the task.
        static void ThreadProc(Object stateInfo) {
            // No state object was passed to QueueUserWorkItem, so 
            // stateInfo is null.
            Console.WriteLine("Hello from the thread pool.");
        }
    }
      

  4.   

    1、线程池主要用于减少因频繁创建和销毁线程带来开销,因此那些经常使用且执行时间短的线程才需要用线程池来管理,用ThreadPool即可。
    2、执行时间较长而又不经常出现的任务,可以单独开辟线程处理,这类任务使用线程池并不会带来明显的性能提升,甚至有可能造成资源浪费。
    3、执行时间较长,但经常出现的任务,需要综合考虑具体执行的时间和出现频度,以及自己编写线程管理的复杂度来衡量;一般情况下,我认为单独开辟线
       就好。
    4、实际作项目时,别忘了不同的机器,性能不一样,多线程处理能力也是不一样的。