一、基本概念
1、进程的基本概念
进程是操作系统执行程序的基本单位, 它包含着一个运行程序所需的资源. 一个正在运行的应用程序在操作系统中被称作为一个进程,进程中可以包含多个线程同时执行代码.进程之间是相对独立的.一个进程无法访问另一个进程的数据(除非利用分布式计算方式).
2、线程的基本概念
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个线程是一个独立执行的路径,可以同时与其他线程一起运行。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如:程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
3、多线程的基本概念
多线程是指程序中包含多个线程. 即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务.
二、线程的生命周期
线程生命周期开始于 System.Threading.Thread 类的对象被创建时, 结束于线程被终止或完成执行时.
线程生命周期中的各种状态:
1、未启动状态
当线程被创建但Start方法未被调用时的状况.
2、就绪状态
当线程准备好运行并等待CPU周期时的状况.
3、不可运行状态
下面几种情况下线程是不可运行的:(已经调用Sleep方法, 已经调用Wait方法, 通过I/O操作阻塞).
4、死亡状态
当线程已完成执行或已终止时的状况.
三、多线程的优缺点
优点:可以同时完成多个任务;可以使程序响应速度更快;可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给别的任务;可以随时停止任务;可以设置每个任务的优先级以优化程序性能。多线程虽然有这么多优点,但是也必须认识到多线程可能存在影响系统性能的不利方面,才能正确使用线程。
缺点:线程也是程序,所以线程需要占用内存,线程越多,占用内存也就越多;线程太多会导致控制太复杂,最终可能造成很多程序缺陷;线程之间对共享资源的访问会相互影响,必须解决争用共享资源的问题.
四、什么场景下使用多线程?
对于我个人来说, 接触多线程是从C/S程序开始的, 比如我运行主窗体的同时需要加载一个子窗体,为了减少实际的等待时间, 我就会考虑使用多线程(异步委托)。
还有就是我在做WPF开发的时候, 当一个界面上有很多设备需要随着别的一些实时运行的设备而更改状态时, 也会用到多线程(异步委托).
总之, 当你处理大量数据时, 或者待执行的任务相对较多时,而同时减少用户等待时间, 可考虑使用多线程(异步委托).
在这里先讲一个知识点:(StopWatch的使用)
StopWatch在System.Diagnostics命名空间下, 要使用它就要先引用这个命名空间.
使用方法如下:
var stopWatch=new StopWatch(); //创建一个StopWatch实例
stopWatch.Start(); //开始计时
stopWatch.Stop(); //停止计时
stopWatch.Reset(); //重置stopWatch
stopWatch.Restart(); //重新启动被停止的stopWatch
stopWatch.ElapsedMilliseconds; //获取stopWatch从开始到现在的时间差, 单位是毫秒;
上述介绍了一些基本概念. 下面开始进入正题。
创建多个线程,每个线程之间都是相互独立的。
class Program { static void Main(string[] args) { Thread t = new Thread(Run); t.Start(); Thread t1 = new Thread(Run); t1.Start(); Thread t2 = new Thread(Run); t2.Start(); } public static void Run() { Console.WriteLine("Hello Word"); } }
此博文主要是介绍了一些关于多线程的基本概念。上述代码只是一个简单的演示示例。
合理使用多线程可以大大提高程序的效率,但也不要什么地方都用,不然反而会降低程序的效率。