.NET 线程、线程池

进程

  进程是一个具有一定独立功能的程序。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

  占用系统独立的资源单元。

 

线程

  • 进程内部的一个执行单元
  • 系统独立调度和分配的基本单位
  • 每个进程,都有一个主线程,由系统自动创建

1)超线程     

利用硬件指令,把1个物理cpu核心内部的2个逻辑内核,模拟成2个物理核心。
    通俗点就是1个cpu变2个cpu了,这时候,同一时刻,就可以2个线程真正的同时运行。

2)多核处理器

就是cpu本身,就有2个或多个物理核心(比如:双核,四核),硬件本身就是可以同一时刻跑2个或多个线程。

  

同一时刻,1个cpu核心只会让1个线程使用。如果有多个线程,则并不是同时运行,需要cpu切换运行线程。

一个时刻,1个cpu核心,只会让1个线程使用

多核心cpu,超线程,同一时刻,可以真正同时运行多个线程。

 

线程池

当一个托管应用程序开始执行时,运行时环境(runtime)提供一个线程池(Thread Pool ),它将在代码第一次访问时被创建。

线程池的工作过程如下:

1. 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。
当添加一个任务时,线程池会做如下判断:

  •   如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
  •   如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;
  •   如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
  •   如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常RejectExecutionException。

2. 当一个线程完成任务时,它会从队列中取下一个任务来执行。
3. 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。

posted @ 2019-06-16 18:23  零柒夭夭  阅读(1752)  评论(0编辑  收藏  举报