我们都知道,在这个行业,追求的就是用最少的时间学最多的知识,这是我写这个系列最想达到的目标,在最快的时间内,帮助更多的人学习更多的线程知识。

前一篇,讲述了线程基础,给大家铺垫了一个基础,这一篇着重介绍线程的作用及其工作方式,顺便小试牛刀一把。

现在我想提出,最直接的问题是:

    为什么要使用线程?

  为什么要使用线程?答案只有三点(欢迎补充^_^):

  1. 使用线程可以将代码同其他代码隔离。这将提高应用程序的可靠性,这不仅仅是应用程序所需要的,更是Windows引入线程的真正原因。
  2. 使用线程可以简化编程。这个答案有利有弊,需要从两方面考虑:第一点:使用线程的同时也就意味着会付出一些资源作为代价,对于现在的计算机,付出资源是值得的,因为它的资源根本没有发掘出来。第二点:引用线程的时候是在需要相互协作的代码时,不能随便的引用线程,盲目的使用线程,只会增加代码复杂度。
  3. 可以用线程来程序的实现并发执行,双管齐下,效率,你懂的(∩_∩)。

说了这么些,总得试试手啊,使用线程?so easy:

 1     class Program
2 {
3 static void Main(string[] args)
4 {
5 Console.WriteLine("主线程:启动专用线程...");
6 Thread dedicatedThread = new Thread(StartCode);
7
8 dedicatedThread.Start(5);
9
10
11 Console.WriteLine("主线程:运行到此");
12 Thread.Sleep(10000);//模拟主线程操作
13 dedicatedThread.Join();
14 Console.WriteLine("主线程:运行完毕");
15 }
16
17 private static void StartCode(Object obj)
18 {
19 Console.WriteLine("子线程:启动代码!{0}",obj);
20 Thread.Sleep(1000);//模拟代码操作
21
22 }
23 }

下面是我两次运行的结果:

  

这是最基本的线程运用,好像不难哦?但是不提倡这么用。

中间有个Join方法,Join的作用是:造成调用线程阻塞当前执行的任何代码,直到dedicatedThread所代表的线程终止或销毁。

同一个程序出现两种输出结果,这是为什么?程序的每次输出不该是一样的吗?

两种输出的不一样是因为Windows对两个线程进行调度的方式不同,这无法控制。Windows抢占式多线程这一概念觉得了这因素。

这个知识点大家有必要了解,这个例子是个专用线程你可以这么用,但是建议应避免这么做,CLR的线程池可以更安全的完成这些事,如果你一定要创

建自己的线程,开始执行专用线程时,需考虑以下四点内容:

  1. 线程需要以非普通线程优先运行。线程池线程都是普通优先级运行,可以更改这个优先级,但不建议这么做。在不同的线程池操纵之间,优先级的更改是无法延续的(线程池这个概念下篇解析)。
  2. 需要线程表现为一个前台进程,防止应用程序在线程结束它的任务之前终止。(线程池的线程始终是后台线程,如果CLR要终止进程,它们就可能无法被迫完成任务)
  3. 一个计算限制的任务需要长时间的运行,就像例子中StartCode(),它执行的就是计算限制的任务。为长时间运行的任务创建一个专业线程,用于避免这个问题。
  4. 任务线程可能调用Abort()(属于Thread)来提前终止它。

线程可以分为前台线程和后台线程

  CLR将每个线程要么视为前台,要么视为后台线程。当一个进程中的所有前台线程停止运行时(也就是我们按右上角的X,关闭程序),CLR将强制终止仍在运行的后台线程直接终止,不会异常。

  基于这个原因,前台线程的使用应该用于执行确实想完成的任务,就用个我们正在用浏览器(下面称前台线程)做例子:

  你正在浏览本篇内容,就意味着这个前台线程,正要完成你所需求的任务指令,解析HTML代码,便于你的阅读,这是首要任务。而加载书签,读取收藏网址的信息等,关键的后台功能,能在应用程序重启的时候继续执行,如果关闭前台线程,它们没必要保持活动的状态。

下面来看个前台线程和后台线程的程序实现:

 1     class Program
2 {
3 static void Main(string[] args)
4 {
5 Thread t = new Thread(StartCode);
6 // t.IsBackground = true;
7 t.Start();
8
9 Console.WriteLine("主线程运行完毕!");
10 }
11
12 private static void StartCode()
13 {
14 Console.WriteLine("开始执行子线程...");
15 Thread.Sleep(10000);//模拟代码操作
16 Console.WriteLine("子线程执行完毕!");
17
18 }
19 }

这段可运行代码就是默认模式,执行的前台代码。它的输出也是你能预测的:

在“开始执行子线程...”的时候,需要等待10秒。

去掉第6行的注释,再看看运行结果:

它不会等待,并看不到“子线程执行完毕”这句话。

前台的好处是,你可以保证你的后台线程能执行完毕,后台线程的好处是,你不用管它的执行。

在一个线程的生存期中,任何时候都可以进行前后台互换。

CLR要提供前台线程和后台线程的概念来更好的支持应用程序域(俗称AppDoMain),每个AppDoMain都可以运行一个单独的应用程序,每个应用程序都有它的前台线程,一个应用程序退出,前台线程终止,对应的后台线程也要终止,但CLR线程仍然需要运行,使其他应用程序继续运行,所有应用程序退出后,整个进程就可以销毁了。CLR算是线程运行的一个空间。

  最后,说个大家十分熟悉的功能,用过Visual Studio 的开发人员,我保证你们都体验过这个功能。

  智能提示都知道,这个是典型的线程运用,很快捷很舒心是不是?

  当你写代码写到兴头时,发现编译器画出红线提示你,某处代码出错了。有没有发现这个?怎么实现的?

  在你停止输入的时候,编译器就会开始编译代码,检测代码中的出错部分,很人性化,这大大提高了C#开发人员的工作效率,而在这,线程功不可没,线程的力量可见一斑。

  线程基础还有一节重要的。下回讲~~~更新有点慢,是为了写出更好的博客。(^。^)y-~~

C#线程篇---解答线程之惑(2)的更多相关文章

  1. linux线程篇 (二) 线程的基本操作

      线程 进程 标识符 pthread_t pid_t 获取ID pthread_self() getpid() 创建 pthread_create() fork 销毁 pthread_exit() ...

  2. linux线程篇 (三) 线程的同步

    1 互斥量 pthreat_mutex_t mymutex; //1. 创建 初始化 int pthread_mutex_init(pthread_mutex_t *mutex, const pthr ...

  3. linux线程篇 (一) 线程的基本概念

    --进程 一个正在执行的程序,资源分配的最小单位 进程中的事情需要按照一定顺序区执行的,但是如何在一个进程中让一些事情同时发生呢?子进程存在缺陷 --引进多线程 --线程:有时又称轻量级进程,程序执行 ...

  4. 羽夏看Win系统内核——进程线程篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  5. iOS开发:(线程篇-上)线程和进程

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  6. iOS开发多线程篇—创建线程

    iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...

  7. 李洪强iOS开发Swift篇---12_NSThread线程相关简单说明

    李洪强iOS开发Swift篇---12_NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThre ...

  8. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <且不超过最大资源数量. 第三个參数能够用来传出先前的资源计数,设为NULL表示不须要传出. 注意:当 ...

  9. JAVA技术专题综述之线程篇(1)

    本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...

随机推荐

  1. 编译Android VNC Server

    1,在如下地址checkout源代码,我checkout的版本为0.9.7http://code.google.com/p/android-vnc-server/source/checkout 2,在 ...

  2. umask命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/stpeace/article/details/45509425        umask命令用得相对不多, 而umask函 ...

  3. 第十次ScrumMeeting博客

    第十次ScrumMeeting博客 本次会议于11月5日(日)22时整在新主楼G座2楼召开,持续20分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕.方科栋. 特邀嘉宾:陈彦吉学长. 1. 每个人 ...

  4. 最小费用最大流模板(POJ 2135-Farm Tour)

    最近正好需要用到最小费用最大流,所以网上就找了这方面的代码,动手写了写,先在博客里存一下~ 代码的题目是POJ2135-Farm Tour 需要了解算法思想的,可以参考下面一篇文章,个人觉得有最大流基 ...

  5. 微信小程序——节奏练耳 宣传页

    节奏练耳是什么? 节奏练耳小程序是一款听音练习节奏的交互式小程序.节奏练耳第一大节是辨认六种音符的练习,剩余九大节的练习题中播放的音频是将时值长短不一的音符组合在一起,配合相应的节奏图片,以提高辨认节 ...

  6. Beta发布--PSP DAILY软件功能说明书2.0

    一.开发背景 你在完成了一周的软件工程作业后,需要提交一个PSP图表,里面有4项,如下所示: 1.本周PSP表格,包含每项任务的开始.中断.结束.最终时间,格式如下: 2.本周进度条,包含从开始到现在 ...

  7. 20162327WJH第二次实验——树

    20162327WJH第一次实验--线性结构 实 验 报 告 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验 ...

  8. 软工1816 · Beta冲刺(4/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进安卓端各个接口的开发,安卓端各个接口已经基本完成 完成食堂各个平面图的绘制 ...

  9. <s:action>的一些用法

    Action标签,顾名思义,是用来调用Action的标签,在JSP中页面中,可以具体指定某一命名空间中的某一Action.而标签的主体用于显示及渲染Actionr的处理结果. action标签有如下几 ...

  10. HDU 1170 Shopping Offers 离散+状态压缩+完全背包

    题目链接: http://poj.org/problem?id=1170 Shopping Offers Time Limit: 1000MSMemory Limit: 10000K 问题描述 In ...