• .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 的大小。

  • 相关阅读:
    react_瞎敲
    linux 删除类似文件
    mysql建立dblink 视图,无法查询到数据的问题
    Guava-Retrying 请求重试机制
    Command line is too long. Shorten command line for WebServiceUtilsTest.callMethod or also for JUnit default
    @Scheduled 定时任务注解不能运行
    jq拷贝表单$("#searchForm").clone(true),无法将select2数据value拷贝的问题
    正则表达式的lookaround(lookahead/lookbehind)以及密码复杂度检查
    MYSQL列的长度,NUMERIC_PRECISION和COLUMN_TYPE
    Qira-docker安装与使用
  • 原文地址:https://www.cnblogs.com/lqyy/p/11032425.html
Copyright © 2020-2023  润新知