C# 线程理解

概念引用:http://blog.csdn.net/yujie_yang/article/details/53173752

多线程和多进程的区别:任务管理器里各种不同的进程就是多进程,或者是你同时运行多个”.exe’程序就可以理解为多进程,多进程是要更多消耗CPU资源的。 
多线程是相对于进程里更小的单位,比如3个线程在1个进程里进行不同的操作,他们所拥有的资源就是那个进程里的资源,不会占用更多资源,只是通过线程更合理的分配资源。 

一.单线程 
在很久以前的MS-DOS时代时代,都是单任务的,比如说我想玩潜艇大战和听歌,很抱歉,只能选择玩潜艇大战或者听歌,不能同时进行。 
所以我只能先玩潜艇大战,玩腻了就关掉游戏打开音乐播放器听一首《七里香》来舒缓心绪,模拟的程序如下:

 public static void game(){Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + " 玩潜艇大战"); } public static void music() { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + " 听七里香"); } static void Main(string[] args) { game(); music(); Console.ReadKey(); }


我们控制台输出的结果为: 
2016-11-15 04:30:56.724 玩潜艇大战 
2016-11-15 04:30:56.755 听七里香

二.双线程 
当然,我们现在的时代大可不必那么老实的先干什么再干什么,我们可以选择边玩游戏,边听歌。模拟代码如下:

public static void game(){Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + " 玩潜艇大战"); } public static void music() { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + " 听七里香"); } static void Main(string[] args) { Thread t1 = new Thread(new ThreadStart(game));//开始一个玩游戏的线程 Thread t2 = new Thread(new ThreadStart(music));//开始一个听音乐的线程 t1.Start(); t2.Start(); Console.ReadKey(); }

控制台输出结果为: 
2016-11-15 04:43:48.987 玩潜艇大战 
2016-11-15 04:43:48.988 听七里香

2016-11-15 04:45:19.315 听七里香 
2016-11-15 04:45:19.315 玩潜艇大战

2016-11-15 04:46:38.513 听七里香 
2016-11-15 04:46:38.512 玩潜艇大战 
这三组结果可以看出,运用线程后玩游戏和听音乐可以同时展开,两个任务不分先后时间差明显比单线程模式要少,更合理的利用了资源。

 

三.三线程 
其实以上的代码中还隐藏了一个线程,就是主线程Main(string[] args),我们下面再改进一下代码看看三个线程运行时的情况。 
核心代码更改如下:

static void Main(string[] args){Thread t1 = new Thread(new ThreadStart(game));//开始一个玩游戏的线程Thread t2 = new Thread(new ThreadStart(music));//开始一个听音乐的线程t1.Priority = ThreadPriority.BelowNormal; t2.Priority = ThreadPriority.Lowest; t1.Start(); t2.Start(); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") +" 边玩游戏边听音乐"); Console.ReadKey(); }

控制台输出结果: 
2016-11-15 05:01:15.598 听七里香 
2016-11-15 05:01:15.575 边玩游戏边听音乐 
2016-11-15 05:01:15.598 玩潜艇大战

2016-11-15 05:03:25.966 听七里香 
2016-11-15 05:03:25.964 边玩游戏边听音乐 
2016-11-15 05:03:25.965 玩潜艇大战

2016-11-15 05:03:50.022 听七里香 
2016-11-15 05:03:50.001 边玩游戏边听音乐 
2016-11-15 05:03:50.001 玩潜艇大战

 

不知道大家注意到没有,主线程每次都是先执行的,并且听音乐好像也总是比玩游戏要晚执行,因为代码里我有一个改动:

            t1.Priority = ThreadPriority.BelowNormal;t2.Priority = ThreadPriority.Lowest;

没错,我设置了线程的优先级,t2代表听音乐的线程优先级比t1玩游戏的优先级要低。对应现实来说就好像我要先打开游戏玩着玩着觉得配乐不好听,所以我选择静音再点开我最爱的《七里香》,这样玩游戏就更加带劲了!

 

四.线程的优先级 
线程的优先级可以通过Thread类Priority属性设置,Priority属性是一个ThreadPriority型枚举,列举了5个优先等级:AboveNormal、BelowNormal、Highest、Lowest、Normal。普通线程的优先级默认为Normal;如果想有更高的优先级,可设置为AboveNormal或Highest;如果想有较低的优先级,可设置为BelowNormal或Lowest。 
也许有人会问那之前的例子主线程总是先完成是不是优先级默认要高呢?其实不是的,主线程和工作线程的优先级相同,也是交替进行,被执行的概率大体相同,至于每次先完成是因为主线程会先启动,只有启动了主线程才能开启其他工作线程。 
要注意的是:系统优先执行优先级较高的线程,但这只意味着优先级较高的线程占有更多的CPU时间,并不意味着一定要先执行完优先级较高的线程,才会执行优先级较低的线程。

 

五.多线程同步

对多线程进行同步,主要用到的是MethodImplAttribute 类 和 SynchronizationAttribute 类,本质上还是基于Lock的实现的。

一个简单如小明和小红两个人用都是主附银行卡,两个人都可以对帐户进行操作,比如帐户余额1000元,比如两个人几乎同时进行取钱600元的操作。

引入MethodImplAttribute 类:

在使用 MethodImplAttribute 类之前需要引用 System.Runtime.Remoting.Contexts 命名空间,System.Runtime.Remoting.Contexts 命名空间包含的一些属性将影响CLR 在运行期间的行为,MethodImplAttribute 就是这样一个属性,MethodImplAttribute类的一个构造函数把MethodImplOptions枚举作为其参数,MethodImplOptions 枚举有一个字段Synchronized,,它指定在任一时刻只允许一个线程访问这个方法。

 

具体参考详解连接  http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html

 

转载于:https://www.cnblogs.com/IWantPower/p/6795213.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言主调函数和被调函数,在C语言中,何为主调函数和被调函数,他们之 – 手机爱问...

2007-08-30请详细一些~最好举出例子你好。评价宝宝的标准基本上是:技能>资质>成长因为宝宝的评价是一项 仁者见仁的活儿,但其中有些规律我想是可以具体话的,希望能对你有帮助:1:技能:技能的意义有多大…

学习关于display :flex 布局问题!

很多人不明白这个display:flex是到底是什么东西,如何使用的 。 1.什么是display:flex呢? 答:flex是 flexible box的缩写,意为弹性布局 ;这个东西的引入,为盒模型提供了最大的灵活性&#xf…

QT信号和槽函数学习笔记

//connect 函数有4个参数 分别是 发送者 信号。接受者 ,槽 //connect(sender,signal,receiver,slot) /* * 信号和槽 * 信号 就是一个普通的函数 定义信号的时候需要在函数前面加上signals: ,不需要实现 * 槽 函数 在QT5中科院是类的任意成员函数&#xf…

数据库和Webapp安全

威胁模型 这是根据我网站上的快速参考页松散地讨论数据库和Webapp安全的问题。 该页面变得笨拙,并且使读者无法轻松地与我或其他人进行交互。 威胁模型 所有安全分析都必须从检查威胁模型开始。 威胁模型要求您回答四个问题: 我要保护的是什么&#…

note同步不及时 one_一辆理想ONE又“跪了”?理想官方紧急发文回应

汽车行业关注(autochat.com.cn)10月16日报道——10月15日,有网友在社交媒体上发布视频,从视频可以看到,一辆理想ONE在遭遇事故后,左前轮脱落在车外疑似断轴,从视频未能判定是断轴引起的事故,还是事故引起的断轴。针对该…

C语言连续多个空格合并一个,C语言合并连续空格

一开始自己写的:a:#includemain(){int c;int state0;while (( cgetchar()) ! EOF) {if (c ){state1;continue;}if (state){state0;putchar( );putchar(c);}elseputchar(c);}}网上搜的:b:#include #define NONBLANK avoid main(){int c , last…

Skywalking 中 Agent 自动同步配置源码解析

文章目录 前言正文实现架构实现模型OAP 同步 ApolloConfigWatcherRegisterConfigChangeWatcher Agent 侧 前言 本文代码 OAP 基于 v9.7,Java Agent 基于 v9.1,配置中心使用 apollo。 看本文需要配合代码“食用”。 正文 Skywalking 中就使用这种模型…

华为5720设置静态路由不通_【干货分享】交换机与路由器在环路中的处理机制了解一下!...

点击蓝字关注我们-今天小盟带大家来讨论一下交换机与路由器在环路中的处理机制-01基础配置1---如图配置路由器各接口地址,AR-2为PC-1的网关路由器2---AR-1配置静态默认路由,下一跳地址指向AR-2;[AR-1]ip route-static 0.0.0.0 0 12.1.1.2AR-2…

IPC 进程间通信方式——信号量

信号量 本质上是共享资源的数目,用来控制对共享资源的访问。用于进程间的互斥和同步每种共享资源对应一个信号量,为了便于大量共享资源的操作引入了信号量集,可对多对信号量一次性操作。对信号量集中所有的操作可以要求全部成功,也…

css选择器的优先级

选择器的优先级表述为4个部分,用0,0,0,0表示。 !important--1,0,0,0行内样式ID选择器--0,1,0,0类选择器(例如,.example)、属性选择器(例如, [type"radio"])或伪类(例如, :hover)--0,0,1,0元素(例…

VisualVM介绍使用

1 打开VisualVM(这个工具放在JDK安装目录的bin目录下,双击jvisualvm.exe即可打开),如下图所示 以VisualVM自身为例,VisualVM本身也是一个java程序,当然也而已用VisualVM来分析 2 概述页面主要显示程序…

c语言奇葩错误,6个奇葩的(hello,world)C语言版(转)

//下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C的编译器用才能编译通过。//程序功能输出 Hello,world!01.c#define _________ }#define ________ putchar#define _______ main#define _(a) ________(a);#define ______ _______(){#define __ _____…

Java功能的适用性

Java语言和标准库功能强大,但功能强大, 责任重大 。 一方面看到很多用户代码滥用或滥用稀有的Java功能,另一方面却完全忘记了大多数基本功能之后,我决定撰写此摘要。 这不是每个Java开发人员都应该探索,了解和使用的要…

台达b3伺服modbus通讯_【数控系统】台达伺服压机控制灵活 精准压合满足各种工序需求...

引言压机是一种利用压力改变工件形状的机械设备。随着制造业少量多样与客制化的日趋发展,压机的的优势逐渐显现,在汽车、五金与电子制造等产业中的应用不断增多。传统压机在使用操作上耗费人力并需要诸多压机元件才能完整运作,维修成本高&…

Binary Agents(二进制值转换字符串)

题目&#xff1a; 传入二进制字符串&#xff0c;翻译成英语句子并返回。 二进制字符串是以空格分隔的。 代码&#xff1a; 1 function binaryAgent(str) {2 var arr str.split( );3 for (var i 0; i < arr.length; i) {4 arr.splice(i,1,String.fromCharCode(BtoD…

我对CSS选择器的认识

我对CSS选择器的认识 一、简述   CSS选择器是对HTML元素进行选择的筛选条件&#xff0c;大概可以分为两类&#xff1a; 特征选择器——根据元素自身所具有的某种特征进行筛选&#xff0c;比如名称、ID、属性等&#xff1b;关系选择器——根据元素与其他元素的关系进行筛选&…

【USACO2006 Mar】滑雪缆车 skilift

【USACO2006 Mar】 滑雪缆车 skilift Time Limit 1000 msMemory Limit 131072 KBytes Description 科罗拉多州的罗恩打算为奶牛建造一个滑雪场&#xff0c;为此要在山上规划一条缆车线路。 整座山可以用一条折线来描述&#xff0c;该折线有N个拐点&#xff0c;起点是1&#xff…

yolov4Linux,基于Darknet的YOLOv4目标检测

目录一、Windows环境下的YOLOv4目标检测1、环境配置环境准备&#xff1a;Win10、CUDA10.1、cuDNN7.65、Visual Studio 2019、OpenCV 3.4(1)Visual Studio2019企业版安装(3)下载并安装CUDA10.1&#xff0c;下载安装cuDNN7.65对于cudnn直接将其解开压缩包&#xff0c;然后需要将b…

二元置信椭圆r语言_医学统计与R语言:圆形树状图(circular dendrogram)

微信公众号&#xff1a;医学统计与R语言如果你觉得对你有帮助&#xff0c;欢迎转发输入1&#xff1a; "ggraph")结果1&#xff1a; name 输入2&#xff1a; <- graph_from_data_frame(myedges1, verticesmyvertices,directed T)ggraph(mygraph, layout dend…

Java:检查器框架

我在JavaOne 2012上 了解的有趣的工具之一是Checker Framework 。 Checker Framework的网页之一 指出 &#xff0c;Checker Framework“增强了Java的类型系统&#xff0c;使其更强大&#xff0c;更有用”&#xff0c;从而使软件开发人员“能够检测并防止Java程序中的错误”。 查…