C# 多线程复习笔记
编码的日子其实也有一段时间了,但是,作为一个客户端程序,因为自己是做游戏开发的,一直没有对线程这个概念比较模糊吧。
记录下线程的整理学习路线。原文:http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html
入门:
概念:
进程:windows系统中一个基本概念,一个正在运行的程序所需要的资源,一个应用程序运行可以视为一个进程。一个进程可以包含一个或多个线程。
线程:进程中的基本执行单元,在进程入口执行的第一个线程被视为这个进程的主线程。
多线程:可以被视作同时运行。(多线程的存在,让程序看上去不是按顺序执行,仿佛多个程序同时进行)
多线程优点:同时完成多个任务,可以让运行速度更快。
多线程缺点:线程越多,占用内存越大,导致程序太复杂,共享资源问题需要处理好。
基础类:
System.Threading.Thread 类
CurrentThread:获取当前正在运行的线程、
ManagerdThredId:获取当前线程中的唯一标识符
当线程们引用一些公用的目标,他们会共享数据。Lock
当两个线程争夺一个锁的时候,一个线程等待。在这种情况下,就确保了同一时刻只有一个线程能进入临界区,
代码如此方式在不确定的多线程环境中叫做线程安全。
Join:一个线程也可以使用Join来等待另外一个线程结束。
Join可以让当前线程运算完毕之后才进行之后的线程。主线程属于调用线程,当主线程调用了calculate.threadAdd.Join()
得时候就发生了阻塞,直到Join的线程执行完毕之后才继续运行。
Thread t = new Thread(delegate () { Console.ReadLine(); }); t.Start(); t.Join(); // 等待直到当前线程执行完毕完成 Console.WriteLine("Thread t's ReadLine complete!");
作用:
线程协调程序确保所有活动的线程被分配适当的执行时间,并且那些等待或阻止的线程----排它锁,都是不消耗CPU时间的。
线程VS进程:
属于单一的应用程序的所有线程逻辑都被包含在一个进程中,进程指一个应用程序所运行的操作系统单元。
何时使用多线程:
多线程一般被用来在后台执行耗时的任务。主线程保持运行,并且工作线程做他的后台工作。
对于Window Form程序来说,如果主程序试图执行冗长的操作,键盘和鼠标的操作会变得迟钝,程序也会失去响应。
由于这个原因,应该在工作线程中运行一个耗时任务时添加一个工作线程,即使在主线程上有一个好的提示“处理中...”
以防止工作无法继续。这就避免了程序出现由操作系统提示的“没有响应”,来诱使用户强制结束程序进程而导致错误。
模式对话框中还允许出现“取消”功能,允许继续接受时间,而实际的任务已经被工作线程完成。BackgroundWorker恰好可以
辅助完成这一功能。
缺点:
当用户频繁的分配和切换线程时,多线程会带来增加资源和CPU开销。
在某些情况下,当只有一个或两个工作线程要比有众多线程在相同时间执行任务快的多。
匿名方法打开了一种怪异的现象,当外部变量被后来的部分修改了值,可能会透过变量进行无意的互动。
常见的方式是将对象实例的方法而不是静态方法传入到线程中,对象实例的属性可以告诉线程要做什么。
命名线程:
Thread.CurrentThread.Name =
"main"
;
前台线程和后台线程:
后台线程一般处理不重要的事,应用程序结束时,后台线程是否执行完对整个应用程序没有影响。如果执行的事情很重要,需要设为前台线程。
线程默认为前台线程,这意味着任何前台线程在运行都会保持程序存活。
如果程序被调用的时候没有任何参数,工作线程为前台线程,并且等待ReadLine语句来等待
用户的出发回车,这期间,主线程退出,但是程序依然保持运行,因为一个前台线程仍然活着。
另一方面,当有参数传入Main,工作线程被赋值为后台线程,当主程序结束程序立刻退出,终止了ReadLine。
Thread worker = new Thread(delegate () { Console.ReadLine(); });
if (false) worker.IsBackground = true;
worker.Start();
总结:主线程退出,前台线程依然存货。isBackGround标记的线程为后台线程,主线程退出,后台线程也退出。
应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,
所有的后台线程在应用程序退出时都会自动结束。
Block(不明白什么意思,暂时先放着)
休眠:
Thread.Sleep
Thread.Sleep放弃了占用CPU,请求不在被分配时间 (直到给点的时间经过)。
Thread.Sleep(0),放弃CPU时间刚刚够其他时间片队列里的活动线程被执行。
while(!proceed) Thread.Sleep(x);//轮洵休眠
x 越大,CPU效率越高,折中方案是增大潜伏时间,任何20ms的花费是微不足道的,除非循环中的条件是极其复杂的。
除了稍有延迟,折中轮洵和休眠的方式可以结合的非常好。
锁和线程安全:
锁实现互斥访问,被用于确保在同一时刻只有一个进程可以进入特殊的代码片段。
在同一时刻只有一个线程可以锁定同步对象,(在这里是locker),任何竞争的其他线程都将被阻止,
直到这个锁被释放。
Interrupt和Abort
一个呗阻止的线程可以通过两种方式呗释放、
Thread.Interrupt
Thread.Abort
C# 多线程复习笔记的更多相关文章
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- Java基础复习笔记系列 四 数组
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- Java基础复习笔记基本排序算法
Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...
随机推荐
- Java集合系列[1]----ArrayList源码分析
本篇分析ArrayList的源码,在分析之前先跟大家谈一谈数组.数组可能是我们最早接触到的数据结构之一,它是在内存中划分出一块连续的地址空间用来进行元素的存储,由于它直接操作内存,所以数组的性能要比集 ...
- hive入门(一)、什么是hive
1.Hive 基本概念 Hive是基于Hadoop的一个 数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL查询功能: Hive是构建在Hadoop 之上的数据仓库: 使用HQL作为查询 ...
- Maven02——回顾、整合ssh框架、分模块开发、私服
1 回顾 1.1 Maven的好处 节省空间 对jar包做了统一管理 依赖管理 一键构建 可跨平台 应用在大型项目可提高开发效率 1.2 Maven安装部署配置 1.3 Maven的仓库 本地仓库 远 ...
- 常用SQL语句集合
一.数据定义 1.创建新数据库:CREATE DATABASE database_name2.创建新表:CREATE TABLE table_name (column_name datatype,co ...
- Tomcat多个项目部署,通过Nginx反向代理分别配置二级域名的流程
购买域名.示例:example.com 设置多个二级域名.如图: 配置tomcat文件: 修改tomcat/conf目录下的server.xml文件: 如下配置配置了3个容器,使用三个不同的端口. 请 ...
- 洛谷 P3377 【模板】左偏树(可并堆)
洛谷 P3377 [模板]左偏树(可并堆) 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或 ...
- enum与typedef enum
enum与typedef enum的用法 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON 1#define T ...
- javascript中函数的执行环境、作用域链、变量对象与活动对象
javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...
- union 时只能查出一个表中的信息,另一个表只能查出字段
原因:news表中title字段的编码,与brand表中的编码不一致导致 y
- php短信接口代码
这篇文章主要为大家详细介绍了php短信接口代码,php短信发送.php批量发送.php获取余额等代码,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了几个常用的php短信接口代码,供大家参考,具体内 ...