【2】Thread例項方法:生命週期管理的ThreadState
1.在clr中Thread這個名字來表示執行緒這個概念
本篇文章講解Thread的例項方法:【id,ThreadState】
2.如何管理Thread的生命週期
Start
Suspend
Resume
Interupt
Abort
(另外還有Join使用很多)
上面5種,在Thread的使用過程中非常多。
例子:實現生命週期中的方法
我們可以實現一個每隔一秒,在TextBox中追加數字的效果
點選開始時,每隔1s,追加數字,並加1
建立window專案,編輯介面,新增TextBox和5個按鈕
Thread thread = null;
int index = 0;
1)開始事件:
///<summary>
/// 開啟執行緒
/// </summary>
/// <paramname="sender"></param>
/// <paramname="e"></param>
private void button1_Click(objectsender, EventArgs e)
{
thread = new Thread(newThreadStart(() =>
{
while (true)
{
try
{
Thread.Sleep(1000);
textBox1.Invoke(newAction(() =>
{
textBox1.AppendText(string.Format("{0}", index++));
}));
}
catch (Exception ex)
{
MessageBox.Show(string.Format("{0},{1}", ex.Message,index));
throw;
}
}
}));
thread.Start();
}
2)暫停事件:
/// <summary>
/// 暫停
/// </summary>
/// <paramname="sender"></param>
/// <paramname="e"></param>
private void button2_Click(objectsender, EventArgs e)
{
//在啟動或者休眠期間可進行暫停
if(thread.ThreadState==ThreadState.Running ||thread.ThreadState==ThreadState.WaitSleepJoin)
thread.Suspend();//已經棄用了
}
點選開始,然後再點選暫停,我們可以在此時使用windbg來檢視thread的狀態
開啟windbg32位,File->Attachto a Process
可以看到有一個後臺執行緒,BackgroundThread:1,總共是3個執行緒
執行!clrstack檢視CLR堆疊
可以點選下圖中的State(第三個是主執行緒),可以看到狀態資訊。
顯示資訊
退出windbg。
3)恢復Resume:將掛起的執行緒重新啟動
/// <summary>
/// 恢復掛起的執行緒
/// </summary>
/// <paramname="sender"></param>
/// <paramname="e"></param>
private void button3_Click(objectsender, EventArgs e)
{
if (thread.ThreadState ==ThreadState.Suspended)
{
thread.Resume();
}
}
4)中斷Interrupt:用來中斷處於WaitSleepJoin狀態的執行緒。
就像
While(true){
Continue ….效果
}
的效果
但是,當你呼叫interrupt的時候,會丟擲一個interrput的異常。
丟擲異常後,while迴圈仍然繼續執行。
所以,如果列印了1,2,3之後中斷,那麼列印的4大概需要4秒(2+2秒休眠時間)
5)Abort
通過丟擲異常的方式銷燬一個執行緒,終止次執行緒。那麼,執行緒後面的操作就不會再執行了。停止後,TextBox就停在3上了。
可以看出Abort和Interrupt之間的區別
此時,使用windbg附加程序,載入sos,clr,檢視執行緒
可以看到此時的主執行緒丟擲了AbortException
重新開啟window程式,啟動-》中止
如果將彈出框(正在中止執行緒)關閉,那麼執行緒就關閉了
開啟windbg附加程序,可以看到執行緒死了,並且主執行緒的OSID沒了,說明已經銷燬。
點選狀態下的數字:
常用的方法:Join:
例子:
建立一個控制檯程式:
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(newThreadStart(() =>
{
Thread.Sleep(1000);
Console.WriteLine("子執行緒執行完畢");
}));
t.Start();
t.Join();//呼叫執行緒等待子執行緒執行完之後才執行。。。【在此等待子執行緒執行完畢】
Console.WriteLine("主執行緒執行完畢");
Console.Read();
}
}
執行,t.Join(),那麼主執行緒必須等待子執行緒t執行完畢後,才能繼續向後執行。相當於阻塞主執行緒。
執行結果:
如果不加t.Join();那麼主執行緒會先執行完畢。
將上述的休眠時間調長,使用windbg,檢視這個睡眠的執行緒能否被中斷:
可以看到,這是一個可中斷的執行緒
相關推薦
【2】Thread例項方法:生命週期管理的ThreadState
1.在clr中Thread這個名字來表示執行緒這個概念 本篇文章講解Thread的例項方法:【id,ThreadState】 2.如何管理Thread的生命週期 Start Suspend Resume Interupt Abort (另外還有Join使用很多) 上面
【執行緒2】Thread的方法
Thread的常用方法 (1).start():啟動執行緒並執行相應的run()方法 (2).run():子執行緒要執行的程式碼放入run()方法中 (3).currentThread():靜態的,調取當前的執行緒 (4).getName():獲取此執行緒的名字 (
【2】循序漸進學 Zabbix :安裝配置 Zabbix Server 服務端
use 簡單的 config .cn href 之前 zab quit 關閉 上一篇 【1】循序漸進學 Zabbix :初識與基礎依賴環境搭建( LNMP ) 安裝 Zabbix Server 上篇我們在 192.16
【2】Caffe學習系列:資料層及引數
要執行caffe,需要先建立一個模型(model),如比較常用的Lenet,Alex等, 而一個模型由多個屋(layer)構成,每一屋又由許多引數組成。所有的引數都定義在caffe.proto這個檔案中。要熟練使用caffe,最重要的就是學會配置檔案(prototxt)的編寫。 層有很多種型別,
【譯文】驅動系統方法:四步設計出好的資料產品
翻譯:克迪 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 在過去幾年中, 我們看到了許多基於預測建模的資料產品。這些產品的範圍從天氣預報到推薦引擎, 再到比航空公司本身更準確地預測航空公司航班時間的服務。但這些產品仍然只是在做預測, 而不是問他
【Django】Django中請求的生命週期
Django的請求生命週期是指當用戶在瀏覽器上輸入url到使用者看到網頁的這個時間段內,Django後臺所發生的事情 1. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端 請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中。 2. u
【譯】最新版本react元件生命週期詳解(v16.3.1)
16版本的react對元件的生命週期函式進行了一些修改,在每個react元件中都有以下幾個生命週期方法~我們需要在不同階段進行討論。為了良好的閱讀體驗,請檢視github原文 元件生命週期概述 1.初始化 在元件初始化階段會執行 1. const
【轉載】C#掃盲之:帶你掌握C#的擴展方法、以及探討擴展方法的本質、註意事項
title [] 很多 標記 真的 參考資料 console 需求 length 1、為什麽需要擴展方法 .NET3.5給我們提供了擴展方法的概念,它的功能是在不修改要添加類型的原有結構時,允許你為類或結構添加新方法。 思考:那麽究竟為什麽需要擴展方法呢,為什麽不直接修
循序漸進學.Net Core Web Api開發系列【2】:利用Swagger調試WebApi
blank form sum json style core image 就會 ring 系列目錄 循序漸進學.Net Core Web Api開發系列目錄 本系列涉及到的源碼下載地址:https://github.com/seabluescn/Blog_WebApi
【Java】Thread類中的join()方法原理
簡介 join()是Thread類的一個方法。根據jdk文件的定義: public final void join()throws InterruptedException: Waits for this thread to die. join()方法的作用,是
【8】Caffe學習系列:solver優化方法
上文提到,到目前為止,caffe總共提供了六種優化方法: Stochastic Gradient Descent (type: "SGD"), AdaDelta (type: "AdaDelta"), Adaptive Gradient (type: "AdaGrad"),
Learning-MySQL【2】:MySQL儲存引擎及資料庫的操作管理
一、儲存引擎 儲存引擎實際上就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料。儲存引擎也可以稱為表型別。 MySQL提供了外掛式(pluggable)的儲存引擎,儲存引擎是基於表的。同一個資料庫,不同的表,儲存引擎可以不同。甚至,同一個資料庫表在不同的場合可以應用不同的儲存引擎。 檢視當前
Python【2】:初入python 使用者輸入,if,(while 迴圈)
python 基礎 編譯型: 一次性將所有程式編譯成二進位制檔案。 缺點:開發效率低,不能跨平臺優點:執行速度快。:c ,c++語言 等等。。。。 解釋行:當程式執行時,一行一行的解釋。 優點:開發效率高,可以跨平臺。缺點:執行速度慢 // 註釋 編譯型 和解釋行 速度 感官 感覺不出
Python【2】:初入python 用戶輸入,if,(while 循環)
交互 enc 編譯型 print nco 用戶輸入 判斷 code pytho python 基礎 編譯型: 一次性將所有程序編譯成二進制文件。 缺點:開發效率低,不能跨平臺優點:運行速度快。:c ,c++語言 等等。。。。 解釋行:當程序執行時,一行一行的解釋。 優
.NET跨平臺開發之Xamarin.Android介紹與生命周期【2】
tin keyevent resource resources des 殺死 roi 1.0 解鎖 前言 不同於IOS,Xamarin在Visual Studio中針對Android,可以很直接的去設計使用者界面,在本系列中,子浩會針對Android目錄結構以及基本控制項
PyQT5例項 【2】 桌面LCD電子時鐘
今天,我要記錄的是用pyqt5寫的一個桌面電子時鐘,涉及到pyqt定時器,LCD顯示控制元件,pyqt5獲取時間等內容,單擊滑鼠右鍵會關閉此時鐘,效果圖如下圖 執行環境:Python35 開發環境: Eclipse-photon +PyDev 題外話: Eclipse真棒,
隨機模擬【2】:隨機模擬的研究範圍和特徵-2
本系列同步釋出於本人的知乎專欄:確定性隨機 個人覺得隨機模擬有一個很大的優勢,那就是用類似於思想實驗的方式對理論進行驗證,同時也能夠解決很多理論上無法最終解析的事情,給出一個近似但很實際用處的結論。 3. 優惠券收集問題 曾經在知乎上看過這樣一個問題: 話說古代中國帝王都是後宮佳麗三千,問若每天晚上皇
【linux】linux報錯:安裝nginx時,make報錯解決方法
目錄 一、報錯情況 二、解決方法 三、openssl舊版本下載和安裝 一、報錯情況 (1)輸入命令,報錯: make (2)具體報錯: make[1]: *** [objs/src/event/ngx_event_openssl.o] 錯誤
【2】Caffe學習系列(11):影象資料轉換成db(leveldb/lmdb)檔案
在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(l
CSS基礎【2】:CSS常見屬性
CSS常見屬性 文字屬性 font-style 作用:規定文字樣式 格式:font-style: italic; 取值: normal:正常的,預設就是正常的 italic:傾斜的 font-weight 作用:規定文字粗細 格式:fo