什麼是線程多線程
· 線程是系統分配處理器時間資源的基本單元,或者說進程以內獨立執行的一個單元。對於操做系統而言,其調度單元是線程。一個進程至少包括一個線程,一般將該線程稱爲主線程。一個進程從主線程的執行開始進而建立一個或多個附加線程,就是所謂基於多線程的多任務。編碼
· 那進程與線程的區別究竟是什麼?進程是執行程序的實例。例如,當你運行記事本程序(Nodepad)時,你就建立了一個用來容納組成 Notepad.exe 的代碼及其所需調用動態連接庫的進程。每一個進程均運行在其專用且受保護的地址空間內。所以,若是你同時運行記事本的兩個拷貝,該程序正在使用的數據在各自實例中是彼此獨立的。在記事本的一個拷貝中將沒法看到該程序的第二個實例打開的數據。操作系統
· 以沙箱爲例進行闡述。一個進程就比如一個沙箱。線程就如同沙箱中的孩子們。孩子們在沙箱子中跑來跑去,而且可能將沙子攘到別的孩子眼中,他們會互相踢打或嬉鬧。可是,這些沙箱略有不一樣之處就在於每一個沙箱徹底由牆壁和頂棚封閉起來,不管箱中的孩子如何狠命地攘沙,他們也不會影響到其它沙箱中的其餘孩子。所以,每一個進程就象一個被保護起來的沙箱。未經許可,無人能夠進出。線程
· 實際上線程運行而進程不運行。兩個進程彼此得到專用數據或內存的惟一途徑就是經過協議來共享內存塊。這是一種協做策略。下面讓咱們分析一下Windows的任務管理器裏的進程選項卡。這裏的進程是指一系列進程,這些進程是由它們所運行的可執行程序實例來識別的,這就是進程選項卡:
blog
第1列給出了映射名稱的緣由。請注意,這裏並無進程名稱列。進程並不擁有獨立於其所歸屬實例的映射名稱。換言之,若是你運行5個記事本拷貝,你將會看到5個稱爲Notepad.exe的進程。它們是如何彼此區別的呢?其中一種方式是經過它們的進程ID(Linux裏稱做PID),由於每一個進程都擁有其獨一無二的編碼。該進程ID由Windows NT或Windows 2000生成,進程結束進程ID隨之收回,能夠再分配給下一個進程使用。所以,進程ID將不會越編越大,它們可以獲得循環重複利用。進程
第2列是啓動此進程的系統用戶。若是沒有名字說明是系統內部啓動的系統進程。
第3列是被進程中的線程所佔用的CPU時間百分比。它不是CPU的編號,而是被進程佔用的CPU時間百分比。此時個人系統基本上是空閒的。儘管系統看上去每一秒左右都只使用一小部分CPU時間,但該系統空閒進程仍舊耗用了大約99%的CPU時間。是CPU被進程中的線程累計佔用的小時、分鐘及秒數。請注意,我對進程中的線程使用「佔用」一詞。這並不必定意味着那就是進程已耗用的CPU時間總和,由於,如咱們一下子將看到的,NT計時的方式是,當特定的時鐘間隔激發時,不管誰恰巧處於當前的線程中,它都將計算到CPU週期以內。一般狀況下,在大多數NT系統中,時鐘以10毫秒的間隔運行。每10毫秒NT的心臟就跳動一下。有一些驅動程序代碼片斷運行並顯示誰是當前的線程。讓咱們將CPU時間的最後10毫秒記在它的賬上。所以,若是A線程開始運行,並在持續運行8毫秒後完成,接着,B線程開始運行並持續了2毫秒,這時,時鐘激發,請猜一猜這整整10毫秒的時鐘週期到底記在了哪一個線程的賬上?答案是第B線程。所以,NT中存在一些固有的不許確性,而NT恰是以這種方式進行計時,實際狀況也如是,大多數32位操做系統中都存在一個基於間隔的計時機制。請記住這一點,由於,有時當你觀察線程所耗用的CPU總和時,會出現儘管該線程或許看上去已運行過數十萬次,但其CPU時間佔用量卻多是零或很是短暫的現象,那麼,上述解釋即是緣由所在。上述也就是咱們在任務管理器的進程選項卡中所能看到的基本信息列。 內存
· 究竟什麼是線程呢?一個線程是給定的指令的序列(你所編寫的代碼片斷),一個棧(在給定的方法中定義的變量),以及一些共享數據(類一級的變量)。線程也能夠從全局類中訪問靜態數據。 資源
棧以及可能的一些共享數據 it
· 每一個線程有其本身的堆棧和程序計數器(PC)。你能夠把程序計數器(PC)設想爲用於跟蹤線程正在執行的指令,而堆棧用於跟蹤線程的上下文,上下文是當線程執行到某處時,當前的局部變量的值。雖然你能夠編寫出在線程之間傳送數據的子程序,在正常狀況下,一個線程不能訪問另一個線程的棧變量。 io
一個線程必須處於以下四種可能的狀態之一
1.初始態:一個線程調用了new方法以後,並在調用start方法以前的所處狀態。在初始態中,能夠調用start()和stop()方法。
2.運行態(Runnable):一旦線程調用了start() 方法,線程就轉到Runnable 運行態,注意,若是線程處於Runnable運行態,它也有可能不在運行,這是由於還有優先級和調度問題。
3.阻塞 / NonRunnable:線程處於阻塞/NonRunnable狀態,這是由兩種可能性形成的:要麼是因掛起而暫停的,要麼是因爲某些緣由而阻塞的,例如包括等待IO請求的完成。
4.退出:線程轉到退出狀態,這有兩種可能性,要麼是run()方法執行結束,要麼是調用了stop()方法。
線程的優先級· 線程能夠設定優先級,高優先級的線程能夠安排在低優先級線程以前完成。一個應用程序能夠經過使用線程中的方法setPriority(int),來設置線程的優先級大小。