什么是进程?
进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。
一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。
什么是线程?
线程是操作系统分配处理器时间的基本单元,也是一个独立的运行单 元,每个进程内部都有多个线程,每个线程都可以各自同时执行指令。每个线程都有自己独立的栈,但是与进程内的其他线程共享内存。但是对于.NET的客户端程序(Console,WPF,WinForms)是由CLR创建的单线程(主线程,且只创建一个线程)来启动。在该线程上可以创建其他线程。
用一个通俗的例子讲就是,一个进程相当于一个工厂,线程就是一个个的车间,工厂(进程)由多个车间(线程)组成,并包含车间(线程)所需的一切资源。工厂(进程)的工作其实就是依赖于车间(线程)的工作。
Thread类:
通过Thread类我们可以发起一个线程
构造函数:
Thread(ThreadStart method);//无参无返回值类型的方法Thread(ParameterizedThreadStart method)//无返回值类型,有一个object参数的方法
属性:
static CurrentThread:返回当前正在运行的线程
Name:设置/返回线程的名字
IsBackground:是否是后台线程
Priority设置优先级的
方法:
Start()启动线程,调用无参无返回值的函数
Start(Object pram)启动线程,pram传参给有参数的方法;
static Sleep(int 毫秒)让线程休眠,处于暂停执行的状态
Abort()终止线程
Join(int 毫秒);挂起(暂停)正在调度的线程,直到被调度的线程执行完毕后,该线程才继续执行
代码示例:
using System;
using System.Threading;
class ThreadTest
{
static void Main()
{
Thread t = new Thread (Write2); // 创建线程t
t.Start(); // 执行 Write2()
// 同时执行主线程上的该方法
for (int i = 0; i < 1000; i++) Console.Write ("1");
}
static void Write2()
{
for (int i = 0; i < 1000; i++) Console.Write ("2");
}
}
//输出:
//111122221122221212122221212......
线程优先级
系统优先执行优先级较高的线程,但这只意味着优先级较高的线程占有更多的CPU时间,并不意味着一定要先执行完优先级较高的线程,才会执行优先级较低的线程。
代码示例:
static void Main(string[] args)
{
Thread thA = new Thread(A); Thread thB = new Thread(B);
//线程优先级
thA.Priority = ThreadPriority.AboveNormal; thB.Priority = ThreadPriority.BelowNormal;
thA.Start();
thB.Start();
}
static void A() {
for (var i = 0; i < 100; i++) { Console.Write("A");
}
}
static void B()
{
for (var i = 0; i < 100; i++)
{
Console.Write("B");
}
}
同步锁:https://www.cnblogs.com/wolf-sun/p/4209521.html
lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待
(即被阻止),直到该对象被释放。
lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。
在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。
打个比方,有这样一个情景,很多公司所在的大厦的厕所的蹲位都是小单间型的,也就是一次只能进去一个人,那么为了避免每次进去一个 人,那怎么做呢?不就是一个人进去之后顺手把门锁上么?这样你在里面干啥事,外边的人也只能等待你解放完了,才能进入。而蹲位的资源
(蹲位,手纸等)是共享的。常用的锁的格式如下:
private static readOnly Object lockObj=new Object(); lock(lockObj){
//执行代码
}
相 当 于 : Monitor.Enter(lockObj); 代 码 块 ; Monitor.Exit(lockObj);
总结:
1.0 线程的和进程的关系以及优缺点
windows系统是一个多线程的操作系统。一个程序至少有一个进程,一个进程至少有一个线程。进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程创建了一个线程,该线程称为主线程。例如当我们创建一个C#控制台程序,程序的入口是Main()函数,Main()函数是始于一个主线程的。它的功能主要是产生新的线程和执行程序。C#是一门支持多线程的编程语言,通过
Thread类创建子线程,引入using System.Threading命名空间。
多线程的优点:
1、 多线程可以提高CPU的利用率,因为当一个线程处于等待状态的时候,CPU会去执行另外的线程
2、 提高了CPU的利用率,就可以直接提高程序的整体执行速度
多线程的缺点:
1、线程开的越多,内存占用越大
2、协调和管理代码的难度加大,需要CPU时间跟踪线程
3、线程之间对资源的共享可能会产生可不遇知的问题