线程,托管线程池,前台线程,后台线程!!!

线程,托管线程池,前台线程,后台线程

一.线程

操做系统使用进程将他们正在执行的不一样应用程序分开。线程是操做系统分配处理器时间的基本单元,而且进程中能够有多个线程同时执行代码。每一个线程都维护异常处理程序,调度优先级和一组系统用于在调度该线程前保存线程上下文的结构。线程上下文包括为使线程在线程的宿主进程地址空间中无缝地继续执行所需的全部信息,包括线程的CPU寄存器组合堆栈。数据库

.Net Framework将操做系统进程进一步细分为由System.AppDomain表示的,称为应用程序域的轻量托管子进程。一个或多个托管线程(由System.Threading.Thread表示)能够在同一个托管进程中的一个或任意数目的应用程序域中运行。虽然每一个应用程序域都是用单个线程启动的,但该应用程序域中的代码能够建立附加应用程序域和附加线程。其结果是托管线程能够在同一个非托管进程中的应用程序域之间自由移动;您可能只有一个线程在若干应用程序域之间移动。服务器

支持抢先多任务处理的操做系统能够建立多个进程中的多个线程同时执行的效果。它经过如下方式实现这一点:在须要处理器时间的线程之间分割可用处理器时间,并轮流为每一个线程分配处理器时间片。当前执行的线程在其时间片结束时被挂起,而另外一个线程继续运行。当系统从一个线程切换到另外一个线程时,它将保存被抢先的线程的线程上下文,并从新加载线程队列中下一个线程的已保存线程上下文。网络

时间片的长度取决于操做系统和处理器。因为每一个时间片都很小,所以即便只有一个处理器,多个线程看起来彷佛也是在同时执行。这实际上就是多处理器系统中发生的情形,在此类系统中,可执行线程分布在多个可用处理器中。多线程

多线程优势

单个应用程序域可使用多个线程完成如下任务异步

  1. 经过网络和Web服务器和数据库通讯
  2. 执行占用大量时间的操做
  3. 区分具备不一样优先级的任务。例如,高优先级线程管理时间关键的任务,低优先级线程执行其余任务。
  4. 使用户界面能够在将时间分配给后台任务时仍能快速作出响应。

多线程缺点

线程处理还具备在设计应用程序时要考虑的资源要求和潜在冲突。这些资源要求以下所述: 1. 系统将为进程,AppDomain对象和线程所需的上下文信息使用内存。所以,能够建立的进程,AppDomain对象和线程的数目可受到可用内存的限制。 2. 跟踪大量的线程将占用大量的处理器时间。若是线程过多,则其中大多数线程都不会产生明显的进度。若是大多数当前线程处于一个进程中,则其余进程中的线程的调度频率就会很低。 3. 使用许多线程控制代码执行很是复杂,并可能产生许多bug。 4. 销毁线程须要了解可能发生的问题并对那些问题进行处理。 5.操作系统

二.托管线程池

1.托管线程池定义

定义: ThreadPool类为你的应用程序提供一个受系统管理的辅助线程池,从而使你可以专一于应用程序任务,而非线程管理。若是有须要后台处理的短任务,托管的线程池则为利用多个线程的简便方法。 用途:.Net FrameWork 将线程池用于多种用途,包括异步I/O完成,计时器回调,注册的等待操做,使用委托的异步方法调用和System.Net套接字链接。线程

2.托管线程池特征

线程池线程是后台线程。每一个线程均使用默认的堆栈大小,以默认的优先级运行,而且位于多线程单元中。每一个进程只有一个线程池。设计

最大线程池线程数:可排入线程池的操做的数量仅受可用内存限制;从.Net Framework4 开始,进程线程池的默认大小取决于若干因素,例如虚拟地址空间的大小。能够用GetMaxThreads和SetMaxThreads方法来控制最大线程数。对象

线程池最小值:线程池根据须要提供的工做线程或I/O完成线程.直到它达到每一个类别的指定最小值。可使用GetMinThreads方法获取最小值.队列

3.什么时候不使用线程池线程?

如下几种状况适合建立并管理本身的线程,而非使用线程池线程:

  1. 须要一个前台线程
  2. 须要具备特定优先级的线程
  3. 拥有会致使线程长时间阻塞的任务。线程池具备最大线程数,所以大量被阻塞的线程池线程可能会组织任务启动。
  4. 需将线程放入单线程单元。全部ThreadPool线程均位于多线程单元中.
  5. 需具备与线程关联的稳定标识,或需将一个线程专用于一项任务.

4.线程池异常

线程池线程上未经处理的异常将终止该进程。如下三种是例外:

1.ThreadAbortException在线程池线程中引起,由于调用了Abort. 2.AppDomainUnloadedException在线程池线程中引起,由于正在卸载应用程序域。 3.公共语言运行时或主机进程将终止该线程.

三.前台线程,后台线程

1.特征

托管线程有多是后台线程,也有多是前台线程。后台线程不会使托管执行环境处于运行状态,除此以外,后台线程和前台线程是同样的。一旦全部前台线程在托管进程(其中.exe文件是托管程序集)中被中止,系统将中止全部后台线程并关闭。线程的前台和后台状态不影响线程中未经处理的异常的结果。

2.哪些是前台线程,哪些是后台线程?

属于托管线程池的线程(即其IsThreadPoolThread属性为true的线程)是后台线程.从非托管代码进入托管执行环境的全部线程都被标记为后台线程.经过建立并启动新的Thread对象而生成的全部线程都默认为前台线程.