﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Wood_K-文章分类-C#</title><link>http://www.cppblog.com/bhjjkg/category/11787.html</link><description>See gull</description><language>zh-cn</language><lastBuildDate>Tue, 15 Sep 2009 06:23:44 GMT</lastBuildDate><pubDate>Tue, 15 Sep 2009 06:23:44 GMT</pubDate><ttl>60</ttl><item><title>C#中System.Threading.Thread类及其线程睡眠代码</title><link>http://www.cppblog.com/bhjjkg/articles/96103.html</link><dc:creator>Wood_K</dc:creator><author>Wood_K</author><pubDate>Mon, 14 Sep 2009 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/bhjjkg/articles/96103.html</guid><wfw:comment>http://www.cppblog.com/bhjjkg/comments/96103.html</wfw:comment><comments>http://www.cppblog.com/bhjjkg/articles/96103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bhjjkg/comments/commentRss/96103.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bhjjkg/services/trackbacks/96103.html</trackback:ping><description><![CDATA[<p><font face=宋体 size=3>using System;<br>using System.Threading;<br>public class arr<br>{<br>public static void Main()<br>{<br>//int[] arr; <br>//arr = new int[5];<br>int luzi;<br>for(luzi=1;luzi&lt;10000;luzi++)<br>{<br>Console.WriteLine("第"+luzi+"行");<br>if (luzi==5000)<br>{<br>Thread.Sleep(10000);<br>}<br>}<br>}<br>}</font></p>
<p>&#160;</p>
<p><font face=宋体 size=3>第5000行开始暂停10秒<br><br>NET 基础类库的System.Threading命名空间提供了大量的类和接口支持多线程。这个命名空间有很多的类。 System.Threading.Thread类是创建并控制线程，设置其优先级并获取其状态最为常用的类。他有很多的方法，在这里我们将就比较常用和 重要的方法做一下介绍：<br>&nbsp;&nbsp;&nbsp;&nbsp; Thread.Start（）：启动线程的执行；<br>Thread.Suspend（）：挂起线程，或者如果线程已挂起，则不起作用；<br>Thread.Resume（）：继续已挂起的线程；<br>Thread.Interrupt（）：中止处于 Wait或者Sleep或者Join 线程状态的线程；<br>Thread.Join（）：阻塞调用线程，直到某个线程终止时为止<br>Thread.Sleep（）：将当前线程阻塞指定的毫秒数；<br>Thread.Abort（）：以开始终止此线程的过程。如果线程已经在终止，则不能通过Thread.Start（）来启动线程。&nbsp;&nbsp; 通过调用Thread.Sleep，Thread.Suspend或者Thread.Join可以暂停/阻塞线程。调用Sleep()和 Suspend()方法意味着线程将不再得到CPU时间。这两种暂停线程的方法是有区别的，Sleep()使得线程立即停止执行，但是在调用 Suspend()方法之前，公共语言运行时必须到达一个安全点。一个线程不能对另外一个线程调用Sleep()方法，但是可以调用Suspend()方 法使得另外一个线程暂停执行。对已经挂起的线程调用Thread.Resume（）方法会使其继续执行。不管使用多少次Suspend()方法来阻塞一个 线程，只需一次调用Resume()方法就可以使得线程继续执行。已经终止的和还没有开始执行的线程都不能使用挂起。Thread.Sleep（int x）使线程阻塞x毫秒。只有当该线程是被其他的线程通过调用Thread.Interrupt（）或者Thread.Abort（）方法，才能被唤醒。如 果对处于阻塞状态的线程调用Thread.Interrupt（）方法将使线程状态改变，但是会抛出 ThreadInterupptedException异常，你可以捕获这个异常并且做出处理，也可以忽略这个异常而让运行时终止线程。在一定的等待时间 之内，Thread.Interrupt（）和Thread.Abort（）都可以立即唤醒一个线程。<br>&nbsp;&nbsp;&nbsp;&nbsp; 我们可以通过使用Thread.Abort（）方法来永久销毁一个线程，而且将抛出ThreadAbortException异常。使终结的线程可以捕获 到异常但是很难控制恢复，仅有的办法是调用Thread.ResetAbort（）来取消刚才的调用，而且只有当这个异常是由于被调用线程引起的异常。对 于A和B两个线程，A线程可以正确的使用Thread.Abort（）方法作用于B线程，但是B线程却不能调用Thread.ResetAbort（）来 取消Thread.Abort（）操作。<br>&nbsp;&nbsp;&nbsp;&nbsp; Thread.Abort（）方法使得系统悄悄的销毁了线程而且不通知用户。一旦实施Thread.Abort（）操作，该线程不能被重新启动。调用了这 个方法并不是意味着线程立即销毁，因此为了确定线程是否被销毁，我们可以调用Thread.Join（）来确定其销毁，Thread.Join（）是一个 阻塞调用，直到线程的确是终止了才返回。但是有可能一个线程调用Thread.Interrupt（）方法来中止另外一个线程，而这个线程正在等待 Thread.Join（）调用的返回。<br>&nbsp;&nbsp;&nbsp; 尽可能的不要用Suspend()方法来挂起阻塞线程，因为这样很容易造成死锁。假设你挂起了一个线程，而这个线程的资源是其他线程所需要的，会发生什么 后果。因此，我们尽可能的给重要性不同的线程以不同的优先级，用Thread.Priority（）方法来代替使用Thread.Suspend（）方 法。<br>Thread类有很多的属性，这些重要的属性是我们多线程编程必须得掌握的。<br>Thread.IsAlive属性：获取一个值，该值指示当前线程的执行状态。如果此线程已启动并且尚未正常终止或中止，则为 true；否则为 false。<br>Thread.Name 属性：获取或设置线程的名称。<br>Thread.Priority 属性：获取或设置一个值，该值指示线程的调度优先级。<br>Thread.ThreadState 属性：获取一个值，该值包含当前线程的状态。thread状态<br>System.Threading.Thread.ThreadState属性定义了执行时线程的状态。线程从创建到线程终止，它一定处于其中某一个 状态。当线程被创建时，它处在Unstarted状态，Thread类的Start() 方法将使线程状态变为Running状态，线程将一直处于这样的状态，除非我们调用了相应的方法使其挂起、阻塞、销毁或者自然终止。如果线程被挂起，它将 处于Suspended状态，除非我们调用resume（）方法使其重新执行，这时候线程将重新变为Running状态。一旦线程被销毁或者终止，线程处 于Stopped状态。处于这个状态的线程将不复存在，正如线程开始启动，线程将不可能回到Unstarted状态。线程还有一个Background状 态，它表明线程运行在前台还是后台。在一个确定的时间，线程可能处于多个状态。据例子来说，一个线程被调用了Sleep而处于阻塞，而接着另外一个线程调 用Abort方法于这个阻塞的线程，这时候线程将同时处于WaitSleepJoin和AbortRequested状态。一旦线程响应转为Sle阻塞或 者中止，当销毁时会抛出ThreadAbortException异常。线程优先级<br>System.Threading.Thread.Priority枚举了线程的优先级别，从而决定了线程能够得到多少CPU时间。高优先级的线程通 常会比一般优先级的线程得到更多的CPU时间，如果不止一个高优先级的线程，操作系统将在这些线程之间循环分配CPU时间。低优先级的线程得到的CPU时 间相对较少，当这里没有高优先级的线程，操作系统将挑选下一个低优先级 的线程执行。一旦低优先级的线程在执行时遇到了高优先级的线程，它将让出CPU给高优先级的线程。新创建的线程优先级为一般优先级，我们可以设置线程的优 先级别的值，如下面所示：　Highest 　AboveNormal 　　Normal 　　BelowNormal 　　Lowest</font></p>
<img src ="http://www.cppblog.com/bhjjkg/aggbug/96103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bhjjkg/" target="_blank">Wood_K</a> 2009-09-14 12:01 <a href="http://www.cppblog.com/bhjjkg/articles/96103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>