今天同事突然問我線程與進程的關系,雖然給她解釋完,但是看她茫然的眼神,我就知道並沒有解釋清楚。
程序概述
談進程與線程之前,我們先談下什么是程序,程序是為實現特定目標或解決特定問題而用計算機語言編寫命令序列的集合。說得通俗點就是你用計算機聽得懂話(編程語言)命令計算機為你做特定的事情。
進程概述
在我理解中,一個進程就是一個程序的一次執行過程,如果要專業的話來說
進程是一個具有一定獨立功能的程序在一個數據集上的一次動態執行的過程,是操作系統進行資源分配和調度的一個獨立單位,是應用程序運行的載體。進程是一種抽象的概念,從來沒有統一的標准定義。進程一般由程序,數據集合和進程控制塊三部分組成。
程序用於描述進程要完成的功能,是控制進程執行的指令集。
數據集合是程序在執行時所需要的數據和工作區;程序控制塊包含進程的描述信息和控制信息是進程存在的唯一標志
實例
打開window的任務管理器,創建一個記事本,打開記事本,會發現在任務管理器的進程列表發現“記事本”這個進程
我們多創建3個記事本,全部打開,觀察進程列表,會發現有四個進程正在運行
那進程是如何工作的,線程(小弟)就閃亮登場了,在談線程前,我們先總結下程序與進程的關系。
程序與進程的關系
- 一個程序可以對應多個進程,表示該程序被多次執行。
- 一個進程只能對應於一個程序,表示該進程是按照某個程序進行的一次執行過程。
線程
很多人好奇進程是如何做事的。事實上進程就是個大爺,是不做事的,而是吩咐別人做事,"別人"就是線程這位苦逼的被壓榨者,當進程要做一件事,就會開啟一個線程,所以我們可以得出一個結論,一個進程至少要有一個線程。沒有線程這位苦逼的勞力就沒人做事。被這么壓榨的線程有一天終於爆發了,准備搞事情,農民起義。不幸的是他還沒正式行動前就失敗了。失敗的原因如下
- 線程不能單獨存在,必須依賴且由進程產生,它是進程的組成部分
- 進程可以有多個線程(多線程),極端情況下,至少有一條線程。
實例
打開記事本,任務管理器
可以看到這個記事本的進程里,有6個線程。
線程的生命周期
新建-->就緒-->運行-->阻塞-->死亡
上廁所
你平時去商城上廁所,准備去上廁所就是新建,上廁所要排隊,排隊就是就緒,有坑位了,輪到你了,拉屎就是運行,你拉完屎發現沒有手紙,要等待別人給你送紙過來,這個狀態就是阻塞,等你上完廁所出來,上廁所這件事情結束了就是死亡狀態了。
注意:便秘也是阻塞狀態,你便秘太久了,別人等不及了,把你趕走,這個就是掛起,還有一種情況,你便秘了,別人等不及了,跟你說你先出去醞釀一下,5分鍾后再過來拉屎,這就是睡眠
多線程
很多人有這樣的體驗,打開瀏覽器,一邊寫博客,一邊聽歌,我們必須打開兩個網頁。一個用來寫作,一個聽歌曲,現在瀏覽器有兩種處理方案,一種先執行聽歌任務,播放任務結束后,在執行寫作任務。如果按這種方式執行,寫博客的想砸電腦的心都有了,另一種就是多線程執行,
瀏覽器開啟兩個線程,一個線程負責播放音樂任務,一個線程打開博客寫作,相當於並行處理兩個任務。但這里的並行有時候並不是真正的的並行,而是將CPU分片,每一片的單位是0.001秒,兩個線程輪番占用CPU的時間,最終在2個線程優先級相同的情況下,會各占用CPU 0.5秒的時間。但因為這個切換太快了,用戶是根本感覺不到的。但這種機制並不是真正的並行。
- 為了更好的利用cpu的資源,如果只有一個線程,則第二個任務必須等到第一個任務結束后才能進行,如果使用多線程則在主線程執行任務的同時可以執行其他任務,而不需要等待。
- 進程之間不能共享數據,線程可以。
- 系統創建進程需要為該進程重新分配系統資源,創建線程代價比較小。
總結
進程和線程都是一個時間段的描述,是CPU工作時間段的描述。
================================================
關於多線程后續Java的線程整理會詳細介紹