• 多线程进程、线程、异步、同步概念


    1 进程、线程、同步、异步的概念

     

    1.1 进程

    进程:程序在服务器上运行时,占据的计算机资源的合集,称之为进程。

    进程之间不会相互干扰-----进程间的通信比较困难

    1.2 线程、多线程

    线程:程序执行的最小单位,响应操作的最小执行流。

          线程也包含自己的计算资源。

          线程是属于进程的,一个进程可以有多个线程。

          线程是应用程序的一个概念,跟计算机语言没有直接关系 

    进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。

    一个应用程序会有多个线程,但是只能有一个进程。也就是说一个进程中可以有很多个线程。那么这是为什么呢?以前计算机只有一个计算模块,

    每次只能单一的执行一个计算单元,不能同时执行多个计算任务。现在随着科技的发展,有了多核CPU,可以一次执行多个应用程序,这样就实现

    了多任务。操作系统为了不让一个应用程序独占CPU。导致其余程序挂起等待,不得不设计出一种将物理计算单元分割为一些虚拟的进程,并给予

    每个执行程序有一定量的计算能力。此外,操作系统必须始终能够有限访问CPU,并能调整不同程序访问CPU的优先级(说白了就是典型的以空间换时间)

    线程正是这一概念的实现,可以认为线程是一个虚拟的进程,用于独立运行一个特定的程序 

    大量使用线程会消耗大量的OS资源

    那么为什么使用线程呢?其实就是为了在相同的时间内,让操作系统或CPU干更多的活,那么在C#中应该如何使用或者说在什么场景下使用呢?

    在C#中关于线程的使用,大多数时候是在当程序需要处理大量繁琐、占用资源多、花费大量时间的任务时进行应用,比如访问数据库,视频显示,

    文件IO操作、网络传输等。

    线程在应用程序中可以进行以下操作:1.创建线程 2.暂停线程 3.线程等待 4.终止线程

    多线程:一个进程里面,有多个线程并发执行

    C#

    多线程Thread:是一个类,就是一个封装,是.NetFramework对线程对象的抽象封装

    通过Thread去完成的操作,最终是通过向操作系统请求得到的执行流。

    CurrentThread当前线程-----任何操作执行都是线程完成的,运行当前这句话的线程

    ManagedThreadId:.Net平台给Thread起的名字,就是一个int值,尽量不重复

    同步单线程方法按顺序执行,每次完成执行后才能进入下一行,是同一个线程运行

    异步多线程:发起调用,不等待结束就直接进入下一行(主线程)动作会由一个新线程来执行(子线程):并发了

    任何的异步多线程都离不开委托delegate-lambda-action-func 

    单线程和多线程的区别

    1. 卡不卡界面

    同步单线程方法:卡界面   ---主线程(UI线程)忙于计算,所以不能响应

    异步多线程方法:不卡界面 ---计算任务交给子线程,主线程(UI线程)已经闲置,可以响应别的操作。

    1. 消耗时间的区别

                                   同步单线程方法慢---因为只有一个线程计算

                                   异步多线程方法快---因为多个线程并发计算

                                  线程并不是越多越好

    同步单线

    1. 是否有序

         1)同步单线程方法有序

         2)异步多线程方法无序(不可预测性):

    异动无序几乎同一时间向操作系统请求线程,也是个需要CPU处理的请求,

    因为线程是系统操作资源,CLR只能去申请,具体是什么顺序,无法掌控

    执行时间不确定同一个线程同一个任务耗时也可能不同  

                      跟操作系统的调度策略有关

                      CPU分片计算能力太强,1s分拆1000儿,宏观上就变成并发的),那任务执行过程就看运气了线程的优先级可以影响操作系统的调度

             ƒ结束无序

    正是因为多线程具备不可预测性,很多时候你的想法并不一定能够贯彻实施,也许大多数情况是ok,但是总有一定的概率出问题

    CS:按钮后能不卡死--上传文件不卡死

    BS:用户注册发邮件/发短信/写日志

    使用多线程时,用通过延时等方式去掌控顺序,不要试图用风骚的多模式掌控顺序

    1.3 多线程安全问题

    定义:一段代码,单线程执行和多线程执行结果不一致,就表明有线程安全问题

    List是个数组结构,在内存上是连续摆放的,假如同一时刻,去增加一个数据,都是操作

    同一个内存位置,2CPU同时命令,内存先执行一个再执行一个,就出现覆盖。

    lock能解决线程安全问题就是单线程化---Lock就是保证方法块任意时刻只有一个线

    能进去,其他线程就排队---单线程化

    Lock原理锁定一个内存引用地址所以不能是类型,也不能是null

    如果共用一个锁变量,就会出现相互阻塞 

    不同的变量,才能并发

    字符串元的,

    泛型类,在类型参数相同时,是同一个类,在类型参数不同时,是不同的类

    前台线程:只有所有的前台线程都结束,应用程序才能结束。默认情况下创建的线程
                  都是前台线程
    后台线程:只要所有的前台线程结束,后台线程自动结束。通过Thread.IsBackground设置后台线程。必须在调用Start方法之前设置线程的类型,否则一旦线程运行,将无法改变其类型。

    通过BeginXXX方法运行的线程都是后台线程。

    相关链接:https://www.bilibili.com/video/BV1if4y1y7Vn?p=1

  • 相关阅读:
    BaseDao
    url中文参数解决方案
    Ajax实现步骤和原理
    在服务器端使用文件时的路径解决方案
    用户验证登录拦截器
    jenkins环境搭建
    gitlab环境搭建
    nexus3.X环境搭建
    base64文件大小计算
    JVM远程调试功能
  • 原文地址:https://www.cnblogs.com/hobelee/p/16439334.html
Copyright © 2020-2023  润新知