成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET中線程的生命周期

開發(fā) 后端
我們今天要談?wù)?NET中線程的生命周期。當(dāng)我們創(chuàng)建一個(gè)線程后,我們需要調(diào)用線程對(duì)象的Start()方法來調(diào)度那個(gè)線程。

  當(dāng)一個(gè)線程計(jì)劃執(zhí)行時(shí)它可以經(jīng)過幾個(gè)狀態(tài),包括未開始,活躍,睡眠,等等。線程類包含幾個(gè)允許你啟動(dòng)、停止、恢復(fù)、退出、暫停以及等待一個(gè)線程的方法。我們可以使用ThreadState屬性來獲取線程的當(dāng)前狀態(tài),狀態(tài)值可能是ThreadState枚舉中的一個(gè):

  Aborted - 線程當(dāng)前處理停止?fàn)顟B(tài),但是不一定已經(jīng)執(zhí)行完。

  AbortRequested – 已經(jīng)調(diào)用Abort() 方法但是線程還沒有接收到將試圖終止線程的System.Threading.ThreadAbortexception。雖然線程還沒有停止,但是馬上就會(huì)。

  Background - 線程在后臺(tái)執(zhí)行。

  Running - 線程已經(jīng)啟動(dòng)而且沒有被阻塞。

  Stopped - 線程已經(jīng)完成了所有指令并停止了。

  StopRequested - 請(qǐng)求線程停止。

  Suspend - 線程已經(jīng)被掛起。

  SuspendRequested - 請(qǐng)求掛起線程。

  Unstarted - 線程還沒有調(diào)用Start()方法之前。

  WaitSleepJoin - 調(diào)用Wait(), Sleep() 或 Join() 方法后處理阻塞狀態(tài)的線程。

  圖3 顯示了一個(gè)線程的生命周期。

圖3

  在這部分,我們將討論線程的生命周期

  讓一個(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.   }  
  60.   } 

 

  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");  
  28.   } 

 

  輸出結(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.   }  
  61.   } 

 

  在上面的例子中,當(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é)果與下面顯示的類似:

原文鏈接:http://www.cnblogs.com/danielWise/archive/2012/01/15/2323084.html

【編輯推薦】

  1. .NET 4多核并行中的Task優(yōu)化線程池
  2. .NET跨線程控件的相關(guān)操作
  3. 詳解.NET多線程異常的處理方法
  4. 講述ADO多線程如何更好的進(jìn)行操作
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2023-10-26 08:25:35

Java線程周期

2010-07-14 10:48:37

Perl線程

2013-08-19 17:03:00

.Net生命周期對(duì)象

2009-06-18 13:32:39

Java線程生命周期

2009-07-23 10:23:44

2009-06-29 18:03:15

Java多線程線程的生命周期

2010-07-14 10:59:15

Perl線程

2009-07-20 10:33:02

ASP.NET MVC

2013-04-07 10:42:56

Asp.Net頁面周期

2009-07-23 18:14:17

MVC生命周期

2015-07-08 16:28:23

weak生命周期

2022-04-19 07:20:24

軟件開發(fā)安全生命周期SSDLC應(yīng)用安全

2009-08-04 17:49:31

Web Page生命周ASP.NET Pos

2009-07-31 17:53:39

ASP.NET線程安全

2009-08-04 16:05:15

ASP.NET頁面生命

2009-08-04 16:50:15

ASP.NET頁面生命

2009-07-31 10:47:18

ASP.NET頁面生命

2009-06-11 11:28:35

JSF生命周期

2009-02-12 13:16:55

請(qǐng)求生命周期MVCASP.NET

2010-01-15 13:52:44

VB.NET對(duì)象生命周
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩一区二区三区av | 91精品国产色综合久久 | 户外露出一区二区三区 | 国产免费av在线 | 亚洲天堂男人的天堂 | 欧美精品一区二区三区在线播放 | 中文字幕欧美一区二区 | 中文字幕一区二区在线观看 | 欧美一区二区三区高清视频 | 成人国内精品久久久久一区 | 国产伦一区二区三区久久 | 日韩欧美国产一区二区三区 | 亚洲精选久久 | 91在线精品一区二区 | 国产专区视频 | 91久久精品日日躁夜夜躁国产 | 成人精品一区二区三区中文字幕 | 欧美激情国产日韩精品一区18 | 亚洲欧美一区二区三区在线 | 色综合久久久久 | 黄视频免费观看 | 91久久久久久久久久久 | 久草在线 | www.av在线| 久久久久久国产精品 | 久久久久国产一区二区三区四区 | 日韩一二区 | 欧美成人激情 | 日本又色又爽又黄又高潮 | 精品人伦一区二区三区蜜桃网站 | 一区二区三区av | 国产亚洲网站 | 欧美区日韩区 | 亚洲人在线| 中文在线一区二区 | 一色桃子av一区二区 | 亚洲国产高清高潮精品美女 | 亚洲精品久久久一区二区三区 | 男人av网 | 最新中文字幕久久 | 正在播放国产精品 |