Java同步—線程和進程
進程和線程
1.線程和進程的定義
進程定義:一個程序在一個數據集上的一次動態執行過程。
簡單來說:
如果把進程比喻成桌子,線程比喻成人,程序比喻成吃飯。
1.單進程單線程:一個人在一個桌子上吃飯
2.單進程多線程:一堆人在一張桌子上一起吃飯
3.多進程多線程:每個人在自己的桌子上吃飯
單進程多線程的問題是:大家容易爭搶,造成一些問題。
多進程多線程的問題是:各吃各的挺好,但是彼此聊天不方便。
Windows:開桌子花銷大,因此鼓勵大家在一個桌子上吃飯,所以Windows多線程的學習重點是解決資源爭搶和同步的方法。
Linux:開桌子花銷小,因此鼓勵每個人在自己的桌子吃飯,但是彼此聊天不方便,所以Linux下多線程的學習重點是進程間通訊的方法。
PS:做一個實驗,創建一個進程,寫入若幹數據、再讀出數據,最後退出,重復1000次。(創建和銷毀進程1000次)
Linux:0.8s
Windows:79.8s
所以Windows開桌子的效率是Linux的100倍左右.
多線程和多進程的本質區別:每一個進程擁有自己的一整套變量,而多線程則共享進程中的數據.
多線程是線程控制的簡寫.
2.Java中的多線程
線程可以有以下六種狀態:
1.New(新創建的)
2.Runnable(可運行的)
3.Blocked(被阻塞的)
4.Waiting(等待)
5.Timed waiting(計時等待)
6.Terminated(被終止)
新建一個線程的時候,線程的狀態是New
一旦調用start方法,線程處於Runnable狀態,表示可以被運行。
當操作系統給線程提供運行的時間的時候,則該線程進入運行狀態。
但是,線程開始運行之後,不會一直保持運行,有的時候會被中斷給其他線程提供運行機會(多線程)。這個狀態一般都是Waiting或者Timed waiting狀態,如果是Timed waiting狀態,在計時結束後,會根據線程的優先級重新讓其進入運行狀態。
線程也可能因為其他線程被堵塞,進入Blocked狀態(目的是同步數據,不造成數據混亂)。
有兩種情況,系統會被終止,進入Terminated狀態,第一種是run方法執行完畢,線程正常結束。第二種是一個沒有捕獲的異常終止了run方法。
PS:原來我們可能用過stop方法來終止一個線程,但是現在該方法已經被棄用,盡量不要在自己的程序中使用它。
3.線程優先級
在Java中,每一個線程都有一個優先級,默認情況下,一個線程繼承他父線程的優先級,但是可以用setPriority方法提高或降低優先級,優先級在1—10之間,最高是10,最低是1.
當線程調度器暫停或結束當前線程的任務,選擇新線程之行時,它首先選擇具有較高優先級的線程。
不要讓程序中功能的調度過分依賴於優先級,應該註意以下問題:當幾個高優先級的線程沒有進入非活動狀態的時候,低優先級的線程永遠不可能執行。
4.守護線程(daemon thread)
Java中有一種很特殊的線程,叫做守護線程,這個線程就一個用途:為其他線程提供服務,計時線程就是一個例子,它會定時發送信號給其他線程或清空過時的緩存。當一個應用程序中只剩下守護線程的時候,虛擬機就會退出,因為如果只剩下守護線程,就沒必要繼續運行程序了。
使用守護線程需要考慮以下的問題:永遠不要使用守護線程去訪問資源,如:文件、數據庫,因為它可能會在任何時候中斷。
設置一個線程為守護線程的方法很簡單:調用線程的setDaemon方法就ok了,傳遞一個bool值,值得註意的是,該方法必須在線程啟動前調用。
5.條件對象
Java同步—線程和進程