C 執行緒從陌生到熟悉 2

2021-12-29 23:16:40 字數 2852 閱讀 3967

表1-1 threadstate定義的列舉常數

成員名稱

說    明

aborted

執行緒處於stopped狀態中

abortrequested

已對執行緒呼叫了thread.abort方法,但執行緒尚未收到試圖終止它的掛起的system.threading. threadabortexception

background

執行緒正作為後台執行緒執行(相對於前台執行緒而言)。此狀態可以通過設定thread.isbackground屬性來控制

running

執行緒已啟動,它未被阻塞,並且沒有掛起的threadabortexception

stopped

執行緒已停止

stoprequested

正在請求執行緒停止。這僅用於內部

suspended

執行緒已掛起

suspendrequested

正在請求執行緒掛起

unstarted

尚未對執行緒呼叫thread.start方法

waitsleepjoin

由於呼叫wait、sleep或join,執行緒已被阻止

thread物件的threadstate屬性提供乙個由threadstate定義的位掩碼,它指示執行緒的當前狀態。乙個執行緒至少總是處於threadstate列舉中定義的乙個可能狀態,並且可以同時處於多個狀態。

注意,只能在一些除錯方案中使用執行緒狀態,而不應該在**中使用執行緒狀態來同步執行緒活動。

在建立託管執行緒時,該執行緒處於unstarted狀態。執行緒會保持unstarted狀態,直到被作業系統排程到已啟動狀態。呼叫start方法使作業系統知道該執行緒可啟動,但是它並不直接更改執行緒的狀態。一旦執行緒處於已啟動的狀態中,就可以執行許多操作來使執行緒更改狀態。表1-2列出了使狀態發生更改的操作,以及相應的新狀態。

表1-2 使執行緒狀態發生更改的操作及相應的新狀態

操    作

threadstate

在公共語言執行庫中建立執行緒

unstarted

執行緒呼叫start

unstarted

執行緒開始執行

running

續表

操    作

threadstate

執行緒呼叫sleep

waitsleepjoin

執行緒對其他物件呼叫wait

waitsleepjoin

執行緒對其他執行緒呼叫join

waitsleepjoin

另乙個執行緒呼叫interrupt

running

另乙個執行緒呼叫suspend

suspendrequested

執行緒響應suspend請求

suspended

另乙個執行緒呼叫resume

running

另乙個執行緒呼叫abort

abortrequested

執行緒響應abort請求

stopped

執行緒被終止

stopped

abort方法,呼叫該方法後,在當前執行緒中引發乙個threadabortexception異常,該異常導致執行緒死亡!執行緒進入stopped狀態,不能在重啟!

請看下面的例子

usingsystem;

usingsystem.collections.generic;

usingsystem.linq;

usingsystem.text;

usingsystem.threading;

namespaceconsoleapplication4

staticvoidprint()

}}

從這個例子中,我們可以看出,執行緒處於unstarted狀態時,呼叫abort()方法時,將引發異常!

將第二個注釋開啟,得到如下結果

執行緒被終止了!把第四個注釋開啟,又會引發異常!

在這裡我要說明下join()這個方法,將第三個注釋開啟,會得到如下結果,

join這個方法的作用是阻塞呼叫他的執行緒,換句話說就是呼叫他的執行緒處於阻塞狀態,直到這個執行緒執行結束,呼叫他的執行緒才繼續執行!這裡呼叫他的執行緒指的是主線程!

interrupt 該方法打斷乙個處於waitsleepjoin狀態的執行緒。

usingsystem;

usingsystem.collections.generic;

usingsystem.linq;

usingsystem.text;

usingsystem.threading;

namespaceconsoleapplication5

staticvoidprint()

catch(exception e)

", e.tostring());

}console.writeline("執行緒1執行!");

}staticvoidprint2()}}

執行結果為

從中可以看出執行緒1調同執行緒2的方法時被打斷了,以致於執行緒1直接執行了!這個就是interrupt得作用!如果將interrupt這個方法給注釋掉,那就會看到執行緒2執行完了,執行緒1才繼續執行!interrupt 該方法打斷乙個處於waitsleepjoin狀態的執行緒。應該可以理解了吧!

好了,這次就到這裡了!

摘自 enuo

Git 從陌生到熟悉

git,是乙個最先進的分布式版本控制系統。目前還在學習中,會持續更新本文 以下的圖很直觀的展示出來git的工作流程 一 總結了幾個常用的術語 1 倉庫 repository 簡單理解為能被git管理起來的乙個目錄,目錄下每個檔案修改 刪除都能被跟蹤。2 工作空間 workspace 簡單理解為目前在...

CSS 從熟悉到更熟悉

最近學習了css,乙個從熟悉到更熟悉的過程,來說說其中的收穫.css,好像在哪兒見過你 層疊樣式表 英文全稱 cascading style sheets 是一種用來表現html 標準通用標記語言的乙個應用 或xml 標準通用標記語言的乙個子集 等檔案樣式的計算機語言.css不僅可以靜態地修飾網頁,...

九個問題從入門到熟悉HTTPS

女朋友也是軟體工程專業,因為快要畢業了,最近一邊做畢設一邊學習程式設計。前兩天她問我 https 的問題,本來想直接扔一篇網上的教程給她。後來想了一下,那些文章大多直接介紹概念,對新手不太友好,於是我乾脆親自給她解釋一下,順便整理了乙份問答錄。http 協議中的內容都是明文傳輸,https 的目的是...