1. 程式人生 > >【2】Thread例項方法:生命週期管理的ThreadState

【2】Thread例項方法:生命週期管理的ThreadState

1.clrThread這個名字來表示執行緒這個概念

本篇文章講解Thread的例項方法:【idThreadState

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

可以看到有一個後臺執行緒,BackgroundThread1,總共是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秒休眠時間)

5Abort

通過丟擲異常的方式銷燬一個執行緒,終止次執行緒。那麼,執行緒後面的操作就不會再執行了。停止後,TextBox就停在3上了。

可以看出AbortInterrupt之間的區別

此時,使用windbg附加程序,載入sosclr,檢視執行緒

可以看到此時的主執行緒丟擲了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,檢視這個睡眠的執行緒能否被中斷:

可以看到,這是一個可中斷的執行緒

相關推薦

2Thread例項方法生命週期管理ThreadState

1.在clr中Thread這個名字來表示執行緒這個概念 本篇文章講解Thread的例項方法:【id,ThreadState】 2.如何管理Thread的生命週期 Start Suspend Resume Interupt Abort (另外還有Join使用很多) 上面

執行緒2Thread方法

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

2Caffe學習系列資料層及引數

要執行caffe,需要先建立一個模型(model),如比較常用的Lenet,Alex等, 而一個模型由多個屋(layer)構成,每一屋又由許多引數組成。所有的引數都定義在caffe.proto這個檔案中。要熟練使用caffe,最重要的就是學會配置檔案(prototxt)的編寫。 層有很多種型別,

譯文驅動系統方法四步設計出好的資料產品

翻譯:克迪 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。   在過去幾年中, 我們看到了許多基於預測建模的資料產品。這些產品的範圍從天氣預報到推薦引擎, 再到比航空公司本身更準確地預測航空公司航班時間的服務。但這些產品仍然只是在做預測, 而不是問他

DjangoDjango中請求的生命週期

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

JavaThread類中的join()方法原理

簡介 join()是Thread類的一個方法。根據jdk文件的定義: public final void join()throws InterruptedException: Waits for this thread to die. join()方法的作用,是

8Caffe學習系列solver優化方法

上文提到,到目前為止,caffe總共提供了六種優化方法: Stochastic Gradient Descent (type: "SGD"), AdaDelta (type: "AdaDelta"), Adaptive Gradient (type: "AdaGrad"),

Learning-MySQL2MySQL儲存引擎及資料庫的操作管理

一、儲存引擎 儲存引擎實際上就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料。儲存引擎也可以稱為表型別。 MySQL提供了外掛式(pluggable)的儲存引擎,儲存引擎是基於表的。同一個資料庫,不同的表,儲存引擎可以不同。甚至,同一個資料庫表在不同的場合可以應用不同的儲存引擎。 檢視當前

Python2初入python 使用者輸入,if,(while 迴圈)

python 基礎 編譯型: 一次性將所有程式編譯成二進位制檔案。 缺點:開發效率低,不能跨平臺優點:執行速度快。:c ,c++語言 等等。。。。 解釋行:當程式執行時,一行一行的解釋。 優點:開發效率高,可以跨平臺。缺點:執行速度慢 // 註釋 編譯型 和解釋行 速度 感官 感覺不出

Python2初入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. 優惠券收集問題 曾經在知乎上看過這樣一個問題: 話說古代中國帝王都是後宮佳麗三千,問若每天晚上皇

linuxlinux報錯安裝nginx時,make報錯解決方法

目錄 一、報錯情況 二、解決方法 三、openssl舊版本下載和安裝 一、報錯情況 (1)輸入命令,報錯: make (2)具體報錯: make[1]: *** [objs/src/event/ngx_event_openssl.o] 錯誤

2Caffe學習系列(11)影象資料轉換成db(leveldb/lmdb)檔案

在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(l

CSS基礎2CSS常見屬性

CSS常見屬性 文字屬性 font-style 作用:規定文字樣式 格式:font-style: italic; 取值: normal:正常的,預設就是正常的 italic:傾斜的 font-weight 作用:規定文字粗細 格式:fo