1. 程式人生 > >Java開發崗位面試題歸類彙總六:多執行緒

Java開發崗位面試題歸類彙總六:多執行緒

1Java建立執行緒之後,直接呼叫start()方法和run()的區別

答:start()用來啟動一個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到cpu時間片,就開始執行run()方法,這裡run()稱為執行緒體,它包含了要執行的這個執行緒的內容,Run方法執行結束,此執行緒隨即終止。

若直接呼叫run(),它只是類的一個普通方法而已,程式中依然只有主執行緒這一個執行緒,就跟執行一個普通方法一樣。

run()方法必須是public訪問許可權,返回值型別為void.。

2、常用的執行緒池模式以及不同執行緒池的使用場景

答:參考http://dev.yesky.com/433/34834433.shtml

3newFixedThreadPool此種執行緒池如果執行緒數達到最大值後會怎麼辦,底層原理。

答:參考:http://www.mamicode.com/info-detail-1085507.html

4、多執行緒之間通訊的同步問題,synchronized鎖的是物件,衍伸出和synchronized相關很多的具體問題,例如同一個類不同方法都有synchronized鎖,一個物件是否可以同時訪問。(互斥的)或者一個類的static構造方法加上synchronized之後的鎖的影響。

答:一個類不同方法都有synchronized鎖,是互斥的,synchronized可以修飾static方法,但是這是鎖的物件時整個類。http://www.2cto.com/kf/201209/152881.html

5、瞭解可重入鎖的含義,以及ReentrantLocksynchronized的區別

答:synchronized可以修飾一個程式碼塊和給物件上鎖;

參考:https://my.oschina.net/u/2250599/blog/410585

6、同步的資料結構,例如concurrentHashMap的原始碼理解以及內部實現原理,為什麼他是同步的且效率高

7atomicintegervolatile等執行緒安全操作的關鍵字的理解和使用

答:volatile不具備原子性,主要講volatile和synchronized的差別。參考http://www.blogjava.net/hello-yun/archive/2012/12/01/392334.html

8、執行緒間通訊,waitnotify

答:呼叫yield和sleep並沒有釋放鎖,而呼叫wait則釋放鎖。可以通過notify()/notifyAll(),或者時間到期,從wait()中恢復執行。http://zhangjunhd.blog.51cto.com/113473/71387/

9、定時執行緒的使用

答:主要涉及到兩個類,一個是java.util.Timer,一個是java.util.TimerTask。Timer:是一種工具,用Timer操作執行緒,可以在後臺執行執行緒中的任務,可以控制這個任務執行一次,或者定期重複執行。TimerTask就是Timer需要安排的任務。

10、場景:在一個主執行緒中,要求有大量(很多很多)子執行緒執行完之後,主執行緒才執行完成。多種方式,考慮效率。

答:參考:http://www.jb51.net/article/96842.htm,方法一:設定一個集合,將所有的執行緒放到list集合中,判斷集合是否還有元素,方法二:設定計數器進行- - 操作;方法三:使用java.util.concurrent.CountDownLatch代替MyCountDown,用await()方法代替while(true){...}

11、程序和執行緒的區別

答:執行緒是指程序內的一個執行單元,也是程序內的可排程實體.與程序的區別:

(1)地址空間:程序內的一個執行單元;程序至少有一個執行緒;它們共享程序的地址空間;而程序有自己獨立的地址空間;

(2)資源擁有:程序是資源分配和擁有的單位,同一個程序內的執行緒共享程序的資源

(3)執行緒是處理器排程的基本單位,但程序不是.

4)二者均可併發執行.

12、什麼叫執行緒安全?舉例說明

答:如果你的程式碼所在的程序中有多個執行緒同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他變數的值也和預期一樣,我們就說是執行緒安全。執行緒安全問題都是由全域性變數和靜態變數引起的。

13、執行緒的幾種狀態

答:新建,就緒,執行,阻塞,死亡;

新建:當使用new操作建立一個執行緒

就緒:呼叫了start(),執行緒分配cpu以外的全部資源,等待獲得cpu排程

執行:執行緒獲得cpu,開始真正執行run()方法

阻塞:正在執行的執行緒沒有執行結束,暫時讓出CPU,這時其他處於就緒狀態的執行緒就可以獲得CPU時間,進入執行狀態。有以下的幾種原因:

1、執行緒呼叫sleep()方法

2、執行緒呼叫一個在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的呼叫者;

3、執行緒試圖得到一個鎖,而該鎖正被其他執行緒持有;

4、執行緒在等待某個觸發條件;

死亡:正常退出或者一個異常結束stop()、interrupt或者設定標誌位

14、併發、同步的介面或方法

答:參考:http://blog.csdn.net/woshisap/article/details/43119569

15HashMap 是否執行緒安全,為何不安全。ConcurrentHashMap,執行緒安全,為何安全。底層實現是怎麼樣的。

答:不是執行緒安全地。當多個執行緒同時操作同一個陣列位置的時候,也都會先取得現在狀態下該位置儲存的頭結點,然後各自去進行計算操作,之後再把結果寫會到該陣列位置去,其實寫回的時候可能其他的執行緒已經就把這個位置給修改過了,就會覆蓋其他執行緒的修改。

16J.U.C下的常見類的使用。 ThreadPool的深入考察; BlockingQueue的使用。(takepoll的區別,putoffer的區別);原子類的實現。

17、簡單介紹下多執行緒的情況,從建立一個執行緒開始。然後怎麼控制同步過程,多執行緒常用的方法和結構

答:參考:http://developer.51cto.com/art/201509/490965.htm

18volatile的理解

答:.volatile關鍵字為域變數的訪問提供了一種免鎖機制

b.使用volatile修飾域相當於告訴虛擬機器該域可能會被其他執行緒更新

c.因此每次使用該域就要重新計算,而不是使用暫存器中的值

d.volatile不會提供任何原子操作,它也不能用來修飾final型別的變數

19、實現多執行緒有幾種方式,多執行緒同步怎麼做,說說幾個執行緒裡常用的方法

答:常用的有兩種方式:實現Runnable介面和繼承Thread類。

多執行緒同步有以下的幾種方式,使用synchronized、特殊域變數volatile、重入鎖ReentrantLock()、使用區域性變數

start(); 表示該執行緒處於活動的,可以搶時間片的狀態,而不是開始執行。

interrupt(); 表示將執行緒物件中斷。如果該執行緒正處於sleep狀態,會丟擲異常(最好不用,不如讓run方法完成執行)

stop(); 表示將執行緒直接終止。(已過時,不安全,如果有正在開啟的資源無法關閉,而執行緒直接被關閉)。

sleep(); 表示該語句寫在那個執行緒中表示要將當前執行緒睡眠。

只能在同步控制方法或同步塊中呼叫wait()notify()notifyAll()