java基礎知識點梳理2

多線程

 進程:正在進行中的程序。其實進程就是一個應用程序運行時的內存分配空間。

 線程:其實就是進程中一個程序執行控制單元,一條執行路徑。進程負責的是應用程序的空間的標示。線程負責的是應用程序的執行順序。


返回當前線程的名稱:Thread.currentThread().getName()

線程的名稱是由:Thread-編號定義的。編號從0開始。

線程要運行的代碼都統一存放在了run方法中。

創建線程的第一種方式:繼承Thread,由子類複寫run方法。

步驟:

1、定義類繼承Thread類;

2、目的是複寫run方法,將要讓線程運行的代碼都存儲到run方法中;

3、通過創建Thread類的子類對象,創建線程對象;

4、調用線程的start方法,開啓線程,並執行run方法。

創建線程的第二種方式:實現一個接口Runnable。

步驟:

1,定義類實現Runnable接口。

2,覆蓋接口中的run方法(用於封裝線程要運行的代碼)。

3,通過Thread類創建線程對象;

4,將實現了Runnable接口的子類對象作爲實際參數傳遞給Thread類中的構造函數。

爲什麼要傳遞呢?因爲要讓線程對象明確要運行的run方法所屬的對象。

5,調用Thread對象的start方法。開啓線程,並運行Runnable接口子類中的run方法。


線程狀態:

被創建:start()

運行:具備執行資格,同時具備執行權;

凍結:sleep(time),wait()—notify()喚醒;線程釋放了執行權,同時釋放執行資格;

臨時阻塞狀態:線程具備cpu的執行資格,沒有cpu的執行權;

消亡:stop()


同步(synchronized):

 

好處:解決了線程安全問題。

弊端:相對降低性能,因爲判斷鎖需要消耗資源,產生了死鎖。

 

定義同步是有前提的

1,必須要有兩個或者兩個以上的線程,才需要同步。

2,多個線程必須保證使用的是同一個鎖。

同步的第二種表現形式:

同步函數:其實就是將同步關鍵字定義在函數上,讓函數具備了同步性。

 

同步函數是用的哪個鎖呢?

通過驗證,函數都有自己所屬的對象this,所以同步函數所使用的鎖就是this鎖

同步死鎖:通常只要將同步進行嵌套,就可以看到現象。同步函數中有同步代碼塊,同步代碼塊中還有同步函數。

線程間通信:思路:多個線程在操作同一個資源,但是操作的動作卻不一樣。

1:將資源封裝成對象。

2:將線程執行的任務(任務其實就是run方法。)也封裝成對象。

等待喚醒機制:涉及的方法:

wait:將同步中的線程處於凍結狀態。釋放了執行權,釋放了資格。同時將線程對象存儲到線程池中。

notify喚醒線程池中某一個等待線程。

notifyAll:喚醒的是線程池中的所有線程。

wait和sleep區別: 分析這兩個方法:從執行權和鎖上來分析:

wait:可以指定時間也可以不指定時間。不指定時間,只能由對應的notify或者notifyAll來喚醒。

sleep:必須指定時間,時間到自動從凍結狀態轉成運行狀態(臨時阻塞狀態)。

wait:線程會釋放執行權,而且線程會釋放鎖。

Sleep:線程會釋放執行權,但不是不釋放鎖。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章