2020 Java 多線程基礎

目錄

 

1、什麼是線程?

2、實現多線程的三種方式

3、start()方法和run()方法的區別

4、 進程和線程之間有什麼不同?

5、 用戶線程和守護線程有什麼區別?

6、如何創建守護線程?

7、volatile 的原理,作用,能代替鎖麼。

8、sleep 和 wait 的區別


1、什麼是線程?

線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。程序員可以通過它進行多處理器編程,你可以使用多線程對 運算密集型任務提速。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。

2、實現多線程的三種方式

通常情況下是兩種方式的

1、繼承Thread類

Thread類其實是實現了Runnable接口的一個實例,繼承Thread類後需要重寫run方法並通過start方法啓動線程。

繼承Thread類耦合性太強了,因爲java只能單繼承,所以不利於擴展。

2、實現Runnable接口

通過實現Runnable接口並重寫run方法,並把Runnable實例傳給Thread對象,Thread的start方法調用run方法再通過調用Runnable實例的run方法啓動線程。

所以如果一個類繼承了另外一個父類,此時要實現多線程就不能通過繼承Thread的類實現。

3、實現Callable接口

通過實現Callable接口並重寫call方法,並把Callable實例傳給FutureTask對象,再把FutureTask對象傳給Thread對象。它與Thread、Runnable最大的不同是Callable能返回一個異步處理的結果Future對象並能拋出異常,而其他兩種不能。

3、start()方法和run()方法的區別

只有調用了start()方法,纔會表現出多線程的特性,不同線程的run()方法裏面的代碼交替執行。如果只是調用run()方法,那麼代碼還是同步執行的,必須等待一個線程的run()方法裏面的代碼全部執行完畢之後,另外一個線程纔可以執行其run()方法裏面的代碼。

4、 進程和線程之間有什麼不同?

一個進程是一個獨立(self contained)的運行環境,它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含了不同的類和程序的單一進程。線程可以被稱爲輕量級進程。線程需要較少的資源來創建和駐留在進程中,並且可以共享進程中的資源。

5、 用戶線程和守護線程有什麼區別?

當我們在Java程序中創建一個線程,它就被稱爲用戶線程。一個守護線程是在後臺執行並且不會阻止JVM終止的線程。當沒有用戶線程在運行的時候,JVM關閉程序並且退出。一個守護線程創建的子線程依然是守護線程。

6、如何創建守護線程?

使用Thread類的setDaemon(true)方法可以將線程設置爲守護線程,需要注意的是,需要在調用start()方法前調用這個方法,否則會拋出IllegalThreadStateException異常。

7、volatile 的原理,作用,能代替鎖麼。

Volatile利用內存柵欄機制來保持變量的一致性。不能代替鎖,其只具備數據可見性一致性,不具備原子性。

8、sleep 和 wait 的區別

sleep是休眠線程,wait是等待,sleep是thread的靜態方法,wait則是object的方法。
Sleep依舊持有鎖,並在指定時間自動喚醒。wait則釋放鎖。

(正在更新。。。)

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