1. 程式人生 > >Java同步—線程和進程

Java同步—線程和進程

sta 需要 兩種 ava ted 在線 原來 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同步—線程和進程