基本概念

进程

打开任务管理器,从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢?

进程(Process)是操作系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一个程序的基本边界。是应用程序的一个运行例程,是应用程序的一次动态执行过程。

线程

在任务管理器里面查询当前总共运行的线程数:

线程(Thread)是程序中一个单一的顺序控制流程。是程序执行流的最小单元。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

多线程

在单个程序中同时运行多个线程完成不同的工作,称为多线程。

多线程的优点:可以同时完成多个任务;可以使程序的响应速度更快;可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给别的任务;可以随时停止任务;可以设置每个任务的优先级以优化程序性能。

为什么可以多线程执行呢?总结起来有下面两方面的原因:

1、CPU运行速度太快,硬件处理速度跟不上,所以操作系统进行分时间片管理。这样,从宏观角度来说是多线程并发的,因为CPU速度太快,察觉不到,看起来是同一时刻执行了不同的操作。但是从微观角度来讲,同一时刻只能有一个线程在处理。

2、目前电脑都是多核多CPU的,一个CPU在同一时刻只能运行一个线程,但是多个CPU在同一时刻就可以运行多个线程。

然而,多线程虽然有很多优点,但是也必须认识到多线程可能存在影响系统性能的不利方面,才能正确使用线程。不利方面主要有如下几点:

(1)线程也是程序,所以线程需要占用内存,线程越多,占用内存也越多。

(2)多线程需要协调和管理,所以需要占用CPU时间以便跟踪线程。

(3)线程之间对共享资源的访问会相互影响,必须解决争用共享资源的问题。

(4)线程太多会导致控制太复杂,最终可能造成很多程序缺陷。

当启动一个可执行程序时,将创建一个主线程。在默认的情况下,C#程序具有一个线程,此线程执行程序中以Main方法开始和结束的代码,Main()方法直接或间接执行的每一个命令都有默认线程(主线程)执行,当Main()方法返回时此线程也将终止。

一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。在C#中,线程是使用Thread类处理的,该类在System.Threading命名空间中。使用Thread类创建线程时,只需要提供线程入口,线程入口告诉程序让这个线程做什么。通过实例化一个Thread类的对象就可以创建一个线程。创建新的Thread对象时,将创建新的托管线程。Thread类接收一个ThreadStart委托或ParameterizedThreadStart委托的构造函数,该委托包装了调用Start方法时由新线程调用的方法,示例代码如下:

Thread thread=new Thread(new ThreadStart(method));//创建线程

thread.Start(); //启动线程

上面代码实例化了一个Thread对象,并指明将要调用的方法method(),然后启动线程。ThreadStart委托中作为参数的方法不需要参数,并且没有返回值。ParameterizedThreadStart委托一个对象作为参数,利用这个参数可以很方便地向线程传递参数,示例代码如下:

Thread thread=new Thread(new ParameterizedThreadStart(method));//创建线程

thread.Start(3); //启动线程

创建多线程的步骤:
1、编写线程所要执行的方法
2、实例化Thread类,并传入一个指向线程所要执行方法的委托。(这时线程已经产生,但还没有运行)
3、调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。

最新文章

  1. HDU2818 并查集
  2. Activity之间传递参数(三)
  3. 【第三方登录】之QQ第三方登录
  4. win7局域网无法ping通本机的问题解决方法
  5. java中path和classpath
  6. windows 删除服务命令
  7. SpringMVC详解
  8. iOS 准备
  9. webpack3中使用postcss-loader和autoprefixer给css3样式添加浏览器兼容
  10. Linux 中环境变量设置
  11. C#相关FTP操作
  12. google的protobuf简单介绍
  13. Mac 绑定Gitlab或者GitHub帐号,从新生成公钥
  14. gerrit代码审核工具之“error unpack failed error Missing unknown”错误解决思路
  15. Django 2.0 学习(13):Django模板继承和静态文件
  16. PAT 1095 Cars on Campus
  17. "Cannot declare member function ...to have static linkage"错误
  18. dev系列之gridview
  19. 几个重要的 ASM Disk Groups 参数
  20. 万恶之源 Python

热门文章

  1. v-if和v-show最重要一点
  2. RestTemplate 远程服务调用
  3. 复习第一点-1.跑通一个helloworld
  4. 蓝牙mesh组网实践(厂商透传模型介绍)
  5. centos系统时间与硬件时间不一致
  6. django的模型层(二)
  7. Jenkins Pipeline(一) - 创建一个新的pipeline
  8. LocalDateTime 使用记录
  9. php composer 配置
  10. windows terminal用ssh连接已重装的服务器提示REMOTE HOST IDENTIFICATION HAS CHANGED!