进程与线程摘要.ppt

第1节 进程与线程 第2节 进程管理类(Process) 程序举例【例2-3】 【例2-3】在Class1类中声明两个方法Method1和Method2,其中Method1不停地输出字符“a”,Method2不停地输出字符“b”,在Form1中启动线程执行Method1和Method2,并在RichTextBox中显示线程输出的字符。(ThreadExample) 2.4 线程同步与线程池 2.4.1 线程的优先级 2.4.2 线程同步 2.4.3 lock语句 2.4.4 线程池 2.4.1 线程的优先级 五个优先级,由高到低分别是:Highest、AboveNormal、 Normal(默认)、BelowNormal和Lowest 可以使用下面的方法为其赋予较高的优先级: Thread t = new Thread(MethodName); t.priority = ThreadPriority.AboveNormal; 通过设置线程的优先级可以改变线程的执行顺序,所设置的优先级仅仅适用于这些线程所属的进程。 注意: 当把某线程的优先级设置为Highest时,系统正在运行的其他线程都会终止,所以使用这个优先级别时要特别小心。 2.4.2 线程同步 同步 指多个线程之间存在先后执行顺序的关联关系。 哪些资源需要同步 系统资源(如通信端口) 多个进程所共享的资源(如文件句柄) 由多个线程访问的单个应用程序域的资源(如全局、静态和实例字段) 2.4.2 线程同步 解决方法: System.Threading命名空间提供了多个用于同步线程的类。这些类包括Mutex、Monitor、Interlocked和AutoResetEvent。 在实际应用中经常使用lock语句完成线程同步。 该语句简化了编程的复杂性,使程序看起来既清晰又简洁 2.4.3 lock语句 lock语句的功能 lock语句可以有效地实现同步,即将代码段(语句块)标记为临界区。它能确保当一个线程位于代码的临界区(可以理解为对某些资源进行操作的一段代码)时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码段,则它将一直等待(即被阻塞),直到锁定的对象被释放以后才能进入临界区。 lock语句的用法 首先利用lock语句锁定某一个对象,然后执行代码段中的语句,等代码段中的语句执行完毕后,再释放该对象。 private Object obj = new Object(); …… lock(obj) { //临界区中的代码 } 2.4.3 lock语句(续) 使用lock语句应注意的问题: 锁定的对象名(上面代码中的obj)一般声明为Object类型,不要将其声明为值类型。 锁定的对象名不能将其声明为public,只能为private 临界区中的代码一般不宜太多。 程序举例【例2-4】 【例2-4】lock语句用法举例:多线程随机取款。 (相当于某公司派多人在多台自动取款机上同时取款) 运行效果:(lockExample) 正确的运行结果 错误的运行结果 2.4.4 线程池 背景: 1)无限制的创建线程消耗系统资源 2)创建线程、回收线程均需要时间 线程池:是在后台执行多个任务的线程集合。 1)最大线程数限制。如果所有线程都繁忙,则额外的任务将放入等待队列中,直到有线程可用时才能够得到处理。 2)最小线程数=创建线程池时应立即启动的数目 3)一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。这种重用使应用程序可以避免为每个任务创建新线程引起的资源和时间消耗。 4)一项工作任务被加入到线程池的队列中,就不能取消该任务,直到该任务完成。 2.4.4 线程池(续) 线程池的默认大小:每个可用处理器25个线程。 每个进程都有一个线程池。 为什么要用线程池? 降低系统开销 可以重用资源,使应用程序可以避免为每个任务创建新线程引起的资源和时间消耗。 什么情况下才使用线程池? 后台执行,而且不同线程没有优先级区别 适用于需要多个线程而实际执行时间又不多的场合 没有导致线程长时间被阻塞的任务(对于可能长时间被阻塞的任务,应该创建单独的线程处理,不应该使用线程池),这是因为线程池具有最大线程数限制,大量阻塞的线程池线程可能会阻止任务启动 2.4.4 线程池(续) ThreadPool类位于System.Threading命名空间下。 ThreadPool提供了对线程池的操作(静态方法),例如:发送工作项、处理异步I/O、设置线程数目等 ThreadPool是一个静态类 托管线程池中的线程为后台线程,即它们的IsBackgr

文档评论(0)

1亿VIP精品文档

相关文档