国产欧美一区二区精品行性色_91精品午夜在线观看_亚洲精品无码激情国产_91精品啪在线观看国产城中村_91看片国产一区二区色欲

始創(chuàng)于2000年 股票代碼:831685
咨詢熱線:0371-60135900 注冊(cè)有禮 登錄
  • 掛牌上市企業(yè)
  • 60秒人工響應(yīng)
  • 99.99%連通率
  • 7*24h人工
  • 故障100倍補(bǔ)償
全部產(chǎn)品
您的位置: 網(wǎng)站首頁 > 幫助中心>文章內(nèi)容

.NET中線程的生命周期

發(fā)布時(shí)間:  2012/9/11 17:06:09

讓一個(gè)線程進(jìn)入睡眠狀態(tài)

當(dāng)我們創(chuàng)建一個(gè)線程后,我們需要調(diào)用線程對(duì)象的Start()方法來調(diào)度那個(gè)線程。在這時(shí),CLR將會(huì)為作為構(gòu)造函數(shù)參數(shù)傳遞給線程對(duì)象的方法地址分配一個(gè)時(shí)間片。一旦線程開始執(zhí)行,它就可以在操作系統(tǒng)處理其他線程時(shí)回到睡眠狀態(tài)或者退出狀態(tài)。我們可以使用線程類的Sleep()方法讓一個(gè)線程進(jìn)入睡眠狀態(tài)。如果你正在等待一個(gè)資源并且你想在稍后繼續(xù)嘗試訪問這個(gè)資源時(shí),Sleep()方法是很重要的。舉個(gè)例子,假設(shè)你的程序由于無法訪問需要的資源而導(dǎo)致其不能繼續(xù)執(zhí)行時(shí),你可能想要在幾毫秒之后嘗試?yán)^續(xù)訪問資源,在這種情況下讓線程在再次嘗試訪問資源之前睡眠一段時(shí)間是一個(gè)很好的方式。

Sleep()方法有兩種重載方式。第一種重載方法有一個(gè)整型參數(shù),并會(huì)按照指定的毫秒時(shí)間暫停線程執(zhí)行。例如,如果你向線程傳遞值100,那么線程將會(huì)暫停100毫秒。這個(gè)方法將會(huì)讓線程進(jìn)入WaitSleepJoin狀態(tài)。讓我們看一個(gè)例子,thread_sleep2.cs:

  1. /*************************************  
  2. /* Copyright (c) 2012 Daniel Dong  
  3. *  
  4. * Author:Daniel Dong  
  5. * Blog: www.cnblogs.com/danielWise  
  6. * Email: guofoo@163.com  
  7. *  
  8. */ 
  9. using System;  
  10. using System.Collections.Generic;  
  11. using System.Text;  
  12. using System.Threading;  
  13. namespace SimpleThread  
  14. {  
  15. public class ThreadSleep  
  16. {  
  17. public static Thread worker;  
  18. public static Thread worker2;  
  19. public static void Main()  
  20. {  
  21. Console.WriteLine("Entering the void Main!");  
  22. worker = new Thread(new ThreadStart(Counter));  
  23. worker2 = new Thread(new ThreadStart(Counter2));  
  24. //Make the worker2 Object as highest priority  
  25. worker2.Priority = ThreadPriority.Highest;  
  26. worker.Start();  
  27. worker2.Start();  
  28. Console.WriteLine("Exiting the void Main!");  
  29. Console.ReadLine();  
  30. }  
  31.  public static void Counter()  
  32. {  
  33. Console.WriteLine("Entering Counter");  
  34. for (int i = 1; i <50; i++)  
  35. {  
  36. Console.Write(i + " ");  
  37. if (i == 10)  
  38. {  
  39. Console.WriteLine();  
  40. Thread.Sleep(1000);  
  41. }  
  42. }  
  43. Console.WriteLine("Exiting Counter");  
  44. }  
  45. public static void Counter2()  
  46. {  
  47. Console.WriteLine("Entering Counter2");  
  48. for (int i = 51; i <100; i++)  
  49. {  
  50. Console.Write(i + " ");  
  51. if (i == 70)  
  52. {  
  53. Console.WriteLine();  
  54. Thread.Sleep(5000);  
  55.  }  
  56. }  
  57. Console.WriteLine("Exiting Counter2");  
  58. }  
  59. }  

 

Counter()方法從1到50計(jì)數(shù),當(dāng)?shù)竭_(dá)10以后睡眠1000毫秒。Counter2()方法從51~100計(jì)數(shù),當(dāng)?shù)竭_(dá)70時(shí)睡眠5000毫秒。下面是輸出結(jié)果:

注:以上是在多核CPU下運(yùn)行的結(jié)果,單核CPU 執(zhí)行情況可能與上圖有所出入。

第二種重載方法有一個(gè)TimeSpan類型參數(shù),當(dāng)前線程會(huì)按照TimeSpan的值暫停一段時(shí)間。TimeSpan是System命名空間中的一個(gè)類。TimeSpan有一些很有用的屬性并會(huì)返回基于時(shí)鐘時(shí)間間隔。

我們可以使用FromSeconds()和FromMinutes()來確定睡眠時(shí)間。下面是一個(gè)例子,thread_sleep3.cs:

 

  1. public static void Counter()  
  2. {  
  3. Console.WriteLine("Entering Counter");  
  4. for (int i = 1; i <50; i++)  
  5. {  
  6. Console.Write(i + " ");  
  7. if (i == 10)  
  8. {  
  9. Console.WriteLine();  
  10. Thread.Sleep(TimeSpan.FromSeconds(1));  
  11.  }  
  12. }  
  13. Console.WriteLine("Exiting Counter");  
  14. }  
  15. public static void Counter2()  
  16. {  
  17. Console.WriteLine("Entering Counter2");  
  18. for (int i = 51; i <100; i++)  
  19. {  
  20.  Console.Write(i + " ");  
  21. if (i == 70)  
  22. {  
  23. Console.WriteLine();  
  24. Thread.Sleep(TimeSpan.FromSeconds(5));  
  25. }  
  26. }  
  27. Console.WriteLine("Exiting Counter2");  

 

輸出結(jié)果與thread_sleep2類似。

中斷一個(gè)線程

當(dāng)讓一個(gè)線程睡眠時(shí),它實(shí)際會(huì)進(jìn)入WaitSleepJoin狀態(tài)。如果線程處理睡眠狀態(tài),那么在它超時(shí)退出之前唯一可以喚醒線程的方式是使用Interrupt()方法。Interrupt()方法將讓線程回到調(diào)度隊(duì)列中去。讓我們看一個(gè)例子,thread_interrupt.cs:

 

  1. /*************************************  
  2. /* Copyright (c) 2012 Daniel Dong  
  3. *  
  4. * Author:Daniel Dong  
  5. * Blog: www.cnblogs.com/danielWise  
  6. * Email: guofoo@163.com  
  7. *  
  8. */ 
  9. using System;  
  10. using System.Collections.Generic;  
  11. using System.Text;  
  12. using System.Threading;  
  13.  namespace SimpleThread  
  14. {  
  15. public class Interrupt  
  16. {  
  17. public static Thread sleeper;  
  18. public static Thread worker;  
  19. public static void Main()  
  20. {  
  21. Console.WriteLine("Entering the void Main!");  
  22. sleeper = new Thread(new ThreadStart(SleepingThread));  
  23. worker = new Thread(new ThreadStart(AwakeThread));  
  24. sleeper.Start();  
  25. worker.Start();  
  26. Console.WriteLine("Exiting the void Main!");  
  27. Console.ReadLine();  
  28. }  
  29.  public static void SleepingThread()  
  30. {  
  31. for (int i = 1; i <50; i++)  
  32. {  
  33. Console.Write(i + " ");  
  34. if (i == 10 || i == 20 || i == 30)  
  35. {  
  36. Console.WriteLine("Going to sleep at: " + i);  
  37. try 
  38. {  
  39. Thread.Sleep(20);  
  40. }  
  41. catch (ThreadInterruptedException ex)  
  42. {  
  43. Console.WriteLine(ex.Message);  
  44. }  
  45.  }  
  46. }  
  47. }  
  48. public static void AwakeThread()  
  49. {  
  50. for (int i = 51; i <100; i++)  
  51. {  
  52. Console.Write(i + " ");  
  53. if (sleeper.ThreadState == ThreadState.WaitSleepJoin)  
  54. {  
  55. Console.WriteLine("Interrupting the sleeping thread.");  
  56. sleeper.Interrupt();  
  57. }  
  58. }  
  59. }  
  60. }  

 

在上面的例子中,當(dāng)計(jì)數(shù)器的值為10, 20 和 30 時(shí)第一個(gè)線程會(huì)睡眠。第二個(gè)線程會(huì)檢查第一個(gè)線程是否已經(jīng)進(jìn)入睡眠狀態(tài)。如果是的話,它將中斷第一個(gè)線程并使它回到調(diào)度隊(duì)列中去。Interrupt()方法是讓睡眠線程重新醒來的最好方式,當(dāng)線程等待的資源可用且你想讓線程繼續(xù)運(yùn)行時(shí)你可以使用這個(gè)方法。輸出結(jié)果與下面顯示的類似:


本文出自:億恩科技【www.cmtents.com】

服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經(jīng)營(yíng)性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經(jīng)營(yíng)性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經(jīng)營(yíng)性ICP/ISP證:贛B2-20080012
  • 服務(wù)器/云主機(jī) 24小時(shí)售后服務(wù)電話:0371-60135900
  • 虛擬主機(jī)/智能建站 24小時(shí)售后服務(wù)電話:0371-60135900
  • 專注服務(wù)器托管17年
    掃掃關(guān)注-微信公眾號(hào)
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號(hào)總部企業(yè)基地億恩大廈  法律顧問:河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號(hào)
      0
     
     
     
     

    0371-60135900
    7*24小時(shí)客服服務(wù)熱線