一、進程和線程:
進程:正在進行的程序。每個進程執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元。
線程:進程內部的一條執行路徑或者一個控制單元。
二者的區別:
一個進程至少有一個線程
進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存;
二、jvm多線程的啓動是多線程嗎?
java的虛擬機jvm啓動的是單線程,就有發生內存泄露的可能,而咱們使用java程序沒出現這樣的問題,
也就是jvm啓動至少有兩個線程,一個執行java程序,一個執行垃圾回收。因此是多線程。
二、多線程的優點:
解決了多部分同時運行的問題,提升效率
三、線程的弊端:
線程太多會致使效率的下降,由於線程的執行依靠的是CPU的來回切換。
四、什麼叫多線程:
一個進程中有多個線程,稱爲多線程。
五、實現多線程的方法:
實現多線程能夠經過繼承Thread類和實現Runnable接口。
(1)繼承Thread
定義一個類繼承Thread類
複寫Thread類中的public void run()方法,將線程的任務代碼封裝到run方法中
直接建立Thread的子類對象,建立線程
調用start()方法,開啓線程(調用線程的任務run方法)
//另外能夠經過Thread的getName()獲取線程的名稱。java
(2)實現Runnable接口;
定義一個類,實現Runnable接口;
覆蓋接口的public void run()的方法,將線程的任務代碼封裝到run方法中;
建立Runnable接口的子類對象
將Runnabl接口的子類對象做爲參數傳遞給Thread類的構造函數,建立Thread類對象
(緣由:線程的任務都封裝在Runnable接口子類對象的run方法中。
因此要在線程對象建立時就必須明確要運行的任務)。
調用start()方法,啓動線程。面試
兩種方法區別:
(1)實現Runnable接口避免了單繼承的侷限性
(2)繼承Thread類線程代碼存放在Thread子類的run方法中
實現Runnable接口線程代碼存放在接口的子類的run方法中;
在定義線程時,建議使用實現Runnable接口,由於幾乎全部多線程均可以使用這種方式實現
六、建立線程是爲何要複寫run方法?
Thread類用於描述線程。Thread類定義了一個功能,用於存儲線程要運行的代碼,該存儲功能就是run方法。
七、start()和run方法有什麼區別?
調用start方法方可啓動線程,而run方法只是thread的一個普通方法,調用run方法不能實現多線程;
Start()方法:
start方法用來啓動線程,實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的
代碼。經過調用Thread類的start()方法來啓動一個線程,這時此線程處於就緒(可運行)狀態,並無運行,
一旦獲得cpu時間片(執行權),就開始執行run()方法,這裏方法run()稱爲線程體,
它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。
Run()方法:
run()方法只是Thread類的一個普通方法,若是直接調用Run方法,程序中依然只有主線程這一個線程,
其程序執行路徑仍是隻有一條,仍是要等待run方法體執行完畢後纔可繼續執行下面的代碼,
這樣就沒有達到多線程的目的。
八、線程的幾種狀態:
新建:new一個Thread對象或者其子類對象就是建立一個線程,當一個線程對象被建立,可是沒有開啓,這個時候,
只是對象線程對象開闢了內存空間和初始化數據。
就緒:新建的對象調用start方法,就開啓了線程,線程就到了就緒狀態。
在這個狀態的線程對象,具備執行資格,沒有執行權。
運行:當線程對象獲取到了CPU的資源。
在這個狀態的線程對象,既有執行資格,也有執行權。
凍結:運行過程當中的線程因爲某些緣由(好比wait,sleep),釋放了執行資格和執行權。
固然,他們能夠回到運行狀態。只不過,不是直接回到。
而是先回到就緒狀態。
死亡:當線程對象調用的run方法結束,或者直接調用stop方法,就讓線程對象死亡,在內存中變成了垃圾。
九、sleep()和wait()的區別:
(1)這兩個方法來自不一樣的類,sleep()來自Thread類,和wait()來自Object類。
(2)sleep是Thread的靜態類方法,誰調用的誰去睡覺,即便在a線程裏調用了b的sleep方法,實際上仍是a去睡覺,
要讓b線程睡覺要在b的代碼中調用sleep。而wait()是Object類的非靜態方法
(3)sleep()釋放資源不釋放鎖,而wait()釋放資源釋放鎖;
(4)使用範圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep能夠在任何地方使用
十、多線程安全問題:
(1)緣由:當程序的多條語句在操做線程共享數據時(如買票例子中的票就是共享資源),因爲線程的隨機性致使
一個線程對多條語句,執行了一部分還沒執行完,另外一個線程搶奪到cpu執行權參與進來執行,
此時就致使共享數據發生錯誤。好比買票例子中打印重票和錯票的狀況。
(2)解決方法:對多條操做共享數據的語句進行同步,一個線程在執行過程當中其餘線程不能夠參與進來
十一、Java中多線程同步是什麼?
同步是用來解決多線程的安全問題的,在多線程中,同步能控制對共享數據的訪問。若是沒有同步,當一個線程在
修改一個共享數據時,而另一個線程正在使用或者更新同一個共享數據,這樣容易致使程序出現錯誤的結果。
十二、什麼是鎖?鎖的做用是什麼?
鎖就是對象
鎖的做用是保證線程同步,解決線程安全問題。
持有鎖的線程能夠在同步中執行,沒有鎖的線程即便得到cpu執行權,也進不去。
1三、同步的前提:
(1)必須保證有兩個以上線程
(2)必須是多個線程使用同一個鎖,即多條語句在操做線程共享數據
(3)必須保證同步中只有一個線程在運行
1四、同步的好處和弊端
好處:同步解決了多線程的安全問題
弊端:多線程都須要判斷鎖,比較消耗資源
1五、同步的兩種表現形式:
(1)同步代碼塊:
能夠指定須要獲取哪一個對象的同步鎖,使用synchronized的代碼塊一樣須要鎖,但他的鎖能夠是任意對象
考慮到安全問題,通常仍是使用同一個對象,相對來講效率較高。
想要更多面試題和學習資料的能夠私聊聯繫我,你們一塊兒交流學習!安全