1. 程式人生 > >Java多執行緒程式設計總結筆記——03概念與原理

Java多執行緒程式設計總結筆記——03概念與原理

作業系統中執行緒和程序的概念

現在的作業系統是多工作業系統。多執行緒是實現多工的一種方式。
程序是指一個記憶體中執行的應用程式,每個程序都有自己獨立的一塊記憶體空間,一個程序中可以啟動多個執行緒。比如在Windows系統中,一個執行的exe就是一個程序。執行緒是指程序中的一個執行流程,一個程序中可以執行多個執行緒。比如java.exe程序中可以執行很多執行緒。執行緒總是屬於某個程序,程序中的多個執行緒共享程序的記憶體。“同時”執行是人的感覺,線上程之間實際上輪換執行。

執行緒的執行

一個Thread類例項只是一個物件,像Java中的任何其他物件一樣,具有變數和方法,生死於堆上。 Java中,每個執行緒都有一個呼叫棧,即使不在程式中建立任何新的執行緒,執行緒也在後臺執行著。 一個Java應用總是從main()方法開始執行,mian()方法執行在一個執行緒內,它被稱為主執行緒。 一旦建立一個新的執行緒,就產生一個新的呼叫棧。 執行緒總體分兩類:使用者執行緒和守候執行緒。當所有使用者執行緒執行完畢的時候,JVM自動關閉。但是守候執行緒卻不獨立於JVM,守候執行緒一般是由作業系統或者使用者自己建立的。

啟動執行緒

在呼叫start()方法之後:發生了一系列複雜的事情啟動新的執行執行緒(具有新的呼叫棧);該執行緒從新狀態轉移到可執行狀態;當該執行緒獲得機會執行時其目標run()方法將執行。

一些常見問題

1、執行緒的名字,一個執行中的執行緒總是有名字的,名字有兩個來源,一個是虛擬機器自己給的名字,一個是你自己的定的名字。在沒有指定執行緒名字的情況下,虛擬機器總會為執行緒指定名字,並且主執行緒的名字總是mian,非主執行緒的名字不確定。

2、執行緒都可以設定名字,也可以獲取執行緒的名字,連主執行緒也不例外。

3、獲取當前執行緒的物件的方法是:Thread.currentThread();

4、在上面的程式碼中,只能保證:每個執行緒都將啟動,每個執行緒都將執行直到完成。一系列執行緒以某種順序啟動並不意味著將按該順序執行。對於任何一組啟動的執行緒來說,排程程式不能保證其執行次序,持續時間也無法保證。

5、當執行緒目標run()方法結束時該執行緒完成。

6、一旦執行緒啟動,它就永遠不能再重新啟動。只有一個新的執行緒可以被啟動,並且只能一次。一個可執行的執行緒或死執行緒可以被重新啟動。

7、執行緒的排程是JVM的一部分,在一個CPU的機器上上,實際上一次只能執行一個執行緒。一次只有一個執行緒棧執行。JVM執行緒排程程式決定實際執行哪個處於可執行狀態的執行緒。

眾多可執行執行緒中的某一個會被選中做為當前執行緒。可執行執行緒被選擇執行的順序是沒有保障的。

8、儘管通常採用佇列形式,但這是沒有保障的。佇列形式是指當一個執行緒完成“一輪”時,它移到可執行佇列的尾部等待,直到它最終排隊到該佇列的前端為止,它才能被再次選中。事實上,我們把它稱為可執行池而不是一個可執行佇列,目的是幫助認識執行緒並不都是以某種有保障的順序排列唱呢個一個佇列的事實。

9、儘管我們沒有無法控制執行緒排程程式,但可以通過別的方式來影響執行緒排程的方式。