第16章 多线程

16.1 线程的概念

16.2 线程的基本操作

16.2.1 创建新线程

Thread th = new Thread()

线程有以下几个常用的属性:

ManagedThreadId属性,托管线程ID,在进程内唯一

name属性,默认为空

ThreadState属性,是一个位标记,描述了线程的当前运行状态:Background、Unstarted、Running、WaitSleepJoin、Stopped。

16.2.2 查看当前线程

Thread.CurrentThread.Name

16.2.3 Sleep()方法

public static void Sleep(int millisecondsTimeout);

public static void Sleep(TimeSpan timeout);

16.2.4 Interrupt()方法

16.2.5 前台线程和后台线程

前台后台区别:所有前台线程执行完毕后,应用程序进程结束,而无论后台进程是否结束。

容易混淆的一个地方:后台线程的background标记就相当于前台线程的running标记,而不是background,running标记

在创建一个线程之后,就应该对它的生存周期有完全的掌控,因此,不去管理后台线程,让它随主线程的结束而终结是很欠妥的做法,尤其是当后台线程还持有一些资源需要关闭时。当后台线程以这种方式退出时,即使位于finally块中的语句也不会执行。

16.2.6 Join()方法

等待线程执行结束后,在继续执行后面的代码

16.2.7 Suspend()和Resume()方法

用于挂起和继续执行已挂起的线程(不推荐使用)

16.2.8 线程异常

当工作线程抛出异常时,整个进程都会关闭,而不是仅结束抛出异常的线程(调用abort方法抛出ThreadAbortException异常除外)

16.2.9 Abort()方法

如果想要强制退出一个线程,可以调用Abort()方法,调用Abort()方法会抛出一个System.Threading.ThreadAbortException异常,该异常很特殊,因为即使不捕获它,也不会影响到整个进程。

16.3 线程同步

线程同步就是协调多个线程间的并发操作,以获得预期的确定的执行结果,消除多线程应用程序执行中的不确定性,包含两方面:

1、保护资源,确保资源同时只能有一个(或指定个数)的线程访问,一般措施是获取锁和释放锁(锁机制)

2、协调线程对资源的访问顺序,即确定某一资源只能现有线程A访问,再由线程B访问,一般措施是采用信号量机制。当B线程访问资源时,必须等待线程A先访问,线程A访问完后,发出信号量,通知线程B可以访问

时间: 2024-07-29 06:59:37

第16章 多线程的相关文章

第16 章 多线程

第16 章 多线程 16.1.1 线程和进程 所有运行中的任务通常对应一个进程(Process).当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中的程序,并且具有一定的独立功能.进程是系统进行资源分配和调度的一个独立单位 一般而言,进程包含如下3个特征 1.独立性 :进程是系统中独立存在的实体,它拥有独立的资源,每一个进程都拥有自己私有的地址空间,没有经过进程本身运行的情况下,一个用户进程不可以访问其他进程的地址空间 2.动态性 :进程与程序的区别在于,程序只是一个静态指令集合,而

《Java开发手册》学习进程之第16章多线程

多线程编程可以使程序具有两条或两条以上的并发执行线索,就像日常工作中由多人同时合作完成一个任务一样.这在很多情况下可以改善程序的响应性能,提高资源的利用效率. 例如,开发一个网上购物时自动邮件通知的程序,在用户单击"提交"按钮确认订单时,一方面要显示信息提示用户订单已确认,一方面应该自动给用户发送一份电子邮件. 如果是单线程模式,则需要等待邮件发送完成之后,再显示提示信息,由于邮件发送的过程相对较慢,用户可能要经过漫长的等待才看到确认信息,界面响应性能不是很好. 而显示订单确认信息与发

敏捷软件开发:原则、模式与实践——第16章 对象图、第17章 用例、第18章 顺序图

第16章 对象图 有时,呈现出系统在某个特定时刻的状态是非常有用的.和一个正在运行系统的快照类似.UML对象图展示了在一个给定时刻获取到的对象.关系和属性值. 不过,你应该对花太多的对象图保持警惕.在大部分的情况下,它们都可以从相应的类图中直接推导出来,因此没有多少用处. 第17章 用例 在所有的UML图中,用例图是最令人迷惑也是最没有用处的.我建议出来系统边界外,忽略掉所有其他的图.系统边界图示例如下: 大矩形是系统边界.矩形内的所有东西都是将要开发的系统的组成部分.矩形外面是操作系统的参与者

第 16 章 观察者模式【Observer Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> <孙子兵法>有云:“知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好的一个办法,我们今天就来讲一个间谍的故事. 韩非子大家都应该记得吧,法家的代表人物,主张建立法制社会,实施重罚制度,真是非常有远见呀,看看现在社会在呼吁什么,建立法制化的社会,在2000 多年前就已经提出了.大家可能还不知道,法家还有

《Cracking the Coding Interview》——第16章:线程与锁——题目5

2014-04-27 20:16 题目:假设一个类Foo有三个公有的成员方法first().second().third().请用锁的方法来控制调用行为,使得他们的执行循序总是遵从first.second.third的顺序. 解法:你应该想到了用lock的方法类阻塞,不过这里面有个概念问题使得直接用ReentrantLock不能通过编译(对于一个锁对象,不同在A线程中锁定,又在B线程中解锁,不允许这样的归属关系),可以用Semaphore来达到相同的目的.请看下面的代码. 代码: 1 // 16

《Cracking the Coding Interview》——第16章:线程与锁——题目3

2014-04-27 19:26 题目:哲学家吃饭问题,死锁问题经典模型(专门用来黑哲学家的?). 解法:死锁四条件:1. 资源互斥.2. 请求保持.3. 非抢占.4. 循环等待.所以,某砖家拿起一只筷子后如果发现没有另一只了,就必须把手里这只筷子放下,这应该是通过破坏"请求保持"原则来防止死锁产生,请求资源失败时,连自己的资源也进一步释放,然后在下一轮里继续请求,直到成功执行. 代码: 1 // This is the class for chopsticks. 2 import j

《Cracking the Coding Interview》——第16章:线程与锁——题目2

2014-04-27 19:14 题目:如何测量上下文切换的时间? 解法:首先,上下文切换是什么,一搜就知道.对于这么一个极短的时间,要测量的话,可以通过放大N倍的方法.比如:有A和B两件事,并且经常一起发生,每件只需要花几纳秒.如果你把A事件连续做几百万次,而B时间只做了几次,这样就能排除B事件对于测量的影响.如果总时间S = mA + nB.当m >> n 时,A≈S / m.下面的测量方法类似于打乒乓球,在主线程和副线程间互相传递一个令牌,这个令牌可以是变量.管道之类的用于通信的工具.与

《Cracking the Coding Interview》——第16章:线程与锁——题目1

2014-04-27 19:09 题目:线程和进程有什么区别? 解法:理论题,操作系统教材上应该有很详细的解释.我回忆了一下,写了如下几点. 代码: 1 // 16.1 What is the difference between process and thread? 2 Answer: 3 Process: 4 1. Basic element of resource allocation in the operating system. 5 2. Possesses independent

第16章 CSS盒模型下

第 16章 CSS盒模型[下]学习要点:1.元素可见性2.元素盒类型3.元素的浮动 本章主要探讨 HTML5中 CSS盒模型,学习怎样了解元素的外观配置以及文档的整体布局. 一.元素可见性使用visibility属性可以实现元素的可见性,这种样式一般可以配合 JavaScript来实现效果.样式表如下:属性 visibility 值 说明 CSS版本visible 默认值,元素在页面上可见 2hidden 元素不可见,但会占据空间. 2collapse 元素不可见,隐藏表格的行与列. 2 如果不