說起線程,無法免俗首先要弄清楚的三個概念就是:進程、線程、協程。OK,那什麼是進程,什麼是線程,哪協程又是啥東西。進程:進程可以簡單的理解為運行在操作系統中的程式,程式時靜態代碼,進程是動態運行著的代碼,程式的運行需要向操作系統申請資源比如記憶體,文件句柄等,特別強調的是進程申請的資源都是獨立的,也就 ...
說起線程,無法免俗首先要弄清楚的三個概念就是:進程、線程、協程。OK,那什麼是進程,什麼是線程,哪協程又是啥東西。進程:進程可以簡單的理解為運行在操作系統中的程式,程式時靜態代碼,進程是動態運行著的代碼,程式的運行需要向操作系統申請資源比如記憶體,文件句柄等,特別強調的是進程申請的資源都是獨立的,也就是進程與進程之間資源是獨立的。它被操作系統調度,所以進程是相對於操作系統的;線程:線程是進程中程式執行任務的那個,它共用著進程申請的資源;協程:可以簡單的說是線程製造的輕量線程。講完了基本的概念看看三者之前的關係圖:
從關係圖看是不是一目瞭然。對了還要強調的一點是,進程和線程都是之間或者間接受管於操作系統內核的,而協程是受管於程式,在用戶態這邊。既然講到java線程,那java協程咋沒聽說過呢,java語言沒有實現協程,實現協程的語言如python,go等,如果想在java中使用協程咋辦,你可以使用協程框架kilim。
講完概念,直接進入java線程的世界。在java中線程可以使用Thread類構造一個線程對象,沒錯new Thread()就是一個線程對象了,和new Date()沒什麼區別,就是一個java 對象實例而已,是不是很簡單?這裡的簡單是指構造簡單,但是引入之後的問題可就不簡單啦(後面會講)。我們知道對象自身是有生命周期的,普通java對象就是死與活兩種生命周期狀態,而對於線程對象則存在new、ready、running、block或者waitting、dead六種狀態,狀態轉換圖:
線程狀態的轉換是依靠JVM調用操作系統內核TCB也就是線程式控制制模塊來實現線程狀態切換的。
既然線程在java中也是個對象,那麼這個對象的屬性又有哪些呢?線程的屬性可分為靜態和動態屬性,靜態這裡指的是,程式員不可改變的,是有jvm分配的,動態是指程式員可以自定義的雖然jvm給了預設屬性值。靜態屬性:id等;動態屬性:name,priority,deamon,group,classloader等。講了這麼多基礎的東西,那來實踐下才是王道。
從上面程式可以看出,我們運行程式的時候,相當於在操作系統中啟動一個jvm的應用程式,也就是進程,然後jvm調用main方法,執行這個main方法的線程是主線程(也就是進程中必然有個入口線程-main thread,即至少一個線程),然後main線程啟動了一個子線程。
好了,java線程基礎入門篇就介紹到這,下一篇繼續線程基礎部分的線程記憶體分配知識。特別說明,本人技術和認識有限,如有錯誤之處,歡迎朋友們指正,萬分感謝。