多线程和多进程的区别:
任务管理器里各种不同的进程就是多进程,或者是你同时运行多个”.exe’程序就可以理解为多进程,多进程是要更多消耗CPU资源的。
多线程是相对于进程里更小的单位,比如3个线程在1个进程里进行不同的操作,他们所拥有的资源就是那个进程里的资源,不会占用更多资源,只是通过线程更合理的分配资源。
运行一个控制台项目.exe,就会生成一个进程,在此进程中会生成一条主线程(主要负责执行Main函数中的代码);
什么是进程?
进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。
一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。
什么是线程?
线程是操作系统分配处理器时间的基本单元,也是一个独立的运行单 元,每个进程内部都有多个线程,每个线程都可以各自同时执行指令。每个线程都有自己独立的栈,但是与进程内的其他线程共享内存。但是对于.NET的客户端程序(Console,WPF,WinForms)是由CLR创建的单线程(主线程,且只创建一个线程)来启动。在该线程上可以创建其他线程。
Thread类:
构造函数:
Thread(ThreadStart method) 无参无返回值类型的方法
Thread(ParameterizedThreadStart method) 无返回值类型,有一个object参数的方法
属性:
static CurrentThread 返回当前正在运行的线程
Name 设置/返回线程的名字
IsBackground 是否是后台线程
Priority 设置优先级的
方法:
Start() 启动线程,调用无参无返回值的函数
Start(Object pram) 启动线程,pram传参给有参数的方法;
Sleep(int 毫秒) 让线程休眠,处于暂停执行的状态
Abort() 终止线程
Join(int 毫秒) 挂起(暂停)正在调度的线程,直到被调度的线程执行完毕后,该线程才继续执行
线程优先级
系统优先执行优先级较高的线程
但这只意味着优先级较高的线程占有更多的CPU时间
并不意味着一定要先执行完优先级较高的线程,才会执行优先级较低的线程。
同步锁:
lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。
在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。
打个比方,有这样一个情景,很多公司所在的大厦的厕所的蹲位都是小单间型的,也就是一次只能进去一个人,那么为了避免每次进去一个 人,那怎么做呢?不就是一个人进去之后顺手把门锁上么?这样你在里面干啥事,外边的人也只能等待你解放完了,才能进入。而蹲位的资源(蹲位,手纸等)是共享的。
常用的锁的格式如下:
private static readOnly Object lockObj=new Object();
public void Fun(){
lock(lockObj){
//执行代码
}
}