多線程面試題【基本概念和線程建立】

你怎麼理解線程?

  • 說到線程,通常要說到進程。微信

  • 進程是指每一個獨立程序在計算機上的一次執行活動,例如運行中的微信程序等。多線程

  • 進程進一步能夠細化爲線程,線程是一個程序內部的一條執行路徑。若是一個程序中能夠在同一時間內執行多個線程,就說這個程序是支持多線程的。併發

線程和進程有什麼區別?

  • 從定義來講,線程只是一個程序內部的一條執行路徑,而進程是全部線程的集合。ide

  • 從切換開銷來講,線程間的切換開銷小,而進程間的切換開銷大。spa

Java中線程分爲哪幾類?

  • Java中的線程分爲兩類:一種是用戶線程,另外一種是守護線程。任何線程均可以是「用戶線程」或「守護線程」,它們幾乎在每一個方面都是同樣的,惟一的區別是判斷虛擬機什麼時候離開。線程

  • 用戶線程:Java虛擬機在它全部非守護線程都已經離開後自動離開。orm

  • 守護線程:是用來服務用戶線程的,若是沒有其餘用戶線程在運行,那麼就沒有可服務的對象,也就沒有理由繼續下去。也被稱爲「後臺線程」或「精靈線程」。對象

  • Java垃圾回收線程就是一個典型的守護線程,當程序中再也不有任何運行中的線程時,程序就不會再產生垃圾,垃圾回收器也就無事可作,因此當垃圾回收線程是Java虛擬機上僅剩的線程時,Java虛擬機會自動離開,結束程序的運行。繼承

一個用戶線程如何變成一個守護線程?

  • 使用setDaemon(true)方法設置。接口

併發和並行分別指什麼?

  • 併發和並行是兩個概念。

  • 並行指同一時刻有多條指令在多個處理器上同時執行。

  • 併發指同一時刻只能有一條指令執行,但多個進程指令被快速輪換執行,使得在宏觀上具備多個進程同時執行的效果。

在什麼狀況下須要用到過多線程?

  • 程序須要同時執行兩個或多個任務時;

  • 程序須要實現一些須要等待的任務時,例如用戶輸入等;

  • 須要一些後臺運行的程序時。

多線程有什麼優勢?

  • 提升應用程序響應,加強用戶體驗。

  • 提升計算機CPU的利用率,節省響應時間。

  • 改善程序結構。

多線程有幾大特性?分別是什麼?

  • 多線程有3大特性,分別爲原子性、可見性、有序性。

  • 原子性是指一個操做是不可中斷的。

  • 可見性是指當一個線程修改了某一個共享變量的值,其餘線程是否可以當即知道這個修改。

  • 有序性是指在併發時,程序的執行可能會出現亂序。給人的直觀感受就是:寫在前面的代碼,會在後面執行。

建立線程有哪幾種方式?

推薦閱讀:建立線程主要有3種方式:

  • 經過繼承Thread類來建立

  • 經過實現Runnable接口來建立

  • 經過實現Callable接口來建立

如何經過繼承Thread類來建立並啓動多線程?

  • 定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體就表明了線程須要完成的任務。

  • 建立Thread子類的實例,即建立了線程對象。

  • 調用線程對象的start()方法來啓動該線程。

如何經過實現Runnable接口來建立並啓動多線程?

  • 定義Runnable接口的實現類,並重寫該接口的run()方法,該run()方法的方法體是該線程的線程執行體。

  • 建立Runnable實現類的實例,並以此實例做爲Thread的target來建立Thread對象,該Thread對象纔是真正的線程對象。

  • 調用線程對象的start()方法來啓動該線程。

如何經過實現Callable接口來實現線程類?

  • 建立Callable接口的實現類,並實現call()方法,該call()方法將做爲線程執行體,且該call()方法有返回值,再建立Callable實現類的實例。

  • 使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法 的返回值。

  • 使用FutureTask對象做爲Thread對象的target建立並啓動新線程。

  • 調用FutureTask類對象的get()方法來得到子線程執行結束後的返回值。

你認爲用哪一種方法實現多線程最好?爲何?

  • 通常推薦採用實現Runnable接口、Callcable接口的方式來建立多線程,由於相較於繼承Thread類的方法,實現Runnable接口、Callcable接口的方式有以下優勢:

  • 線程類只是實現了Runnable接口或者Callcable接口,還能夠繼承其餘類。

  • 在這種方式下,多個線程能夠共享同一個target對象,因此很是適合多個相同線程來處理同一份資源的狀況,從而能夠將CPU、代碼和數據分開,造成清晰的模型,較好地體現了面向對象的思想。

線程的run()方法和start()方法有什麼區別和聯繫?

  • 啓動線程使用start()方法,而不是run()方法;

  • 調用start()方法來啓動線程,系統會把該run()方法當成線程執行體來處理;

  • 若是直接調用線程對象的run()方法,則run()方法當即就會被執行,並且在run()方法返回以前其餘線程沒法並行執行。

相關文章
相關標籤/搜索