1. 程式人生 > >15+N個頂級網上流行的Java多執行緒面試題及自己總結的答案(遇到即會更新)

15+N個頂級網上流行的Java多執行緒面試題及自己總結的答案(遇到即會更新)

1)現在有T1、T2、T3三個執行緒,你怎樣保證T2在T1執行完後執行,T3在T2執行完後執行?直接上程式碼(所有程式均以簡單明瞭為主)

原文引用:這個執行緒問題通常會在第一輪或電話面試階段被問到,目的是檢測你對”join”方法是否熟悉。這個多執行緒問題比較簡單,可以用join方法實現。 

自己總結:

//還不如順序寫程式了,不用執行緒了,哈哈
public class JoinTest 
{

	
	public static void main(String[] args) throws InterruptedException 
	{
		Thread1 T1=new Thread1();
		Thread2 T2=new Thread2();
		Thread3 T3=new Thread3();
		T1.start();
		
		T1.join();
		T2.start();
		T2.join();
		T3.start();
		T3.join();
		

	}

}

class Thread1 extends Thread
{
	
	public void run()
	{
		
		System.out.println("T1 running");
		
				
	}
	
}

class Thread2 extends Thread
{
	
	public void run()
	{
		
		System.out.println("T2 running");
					
		
	}
	
}

class Thread3 extends Thread
{
	
	public void run()
	{
		
		System.out.println("T3 running");
				
	}
	
}
join()表示無限期等待直到該執行緒結束,join(millis)表示只等待該執行緒millis毫秒的時間,關於join()具體的介紹大家可參考這篇文章,介紹的比較好 http://www.blogjava.net/vincent/archive/2008/08/23/223912.html

2)在Java中Lock介面比synchronized塊的優勢是什麼?你需要實現一個高效的快取,它允許多個使用者讀,但只允許一個使用者寫,以此來保持它的完整性,你會怎樣去實現它?

原文引用:lock介面在多執行緒和併發程式設計中最大的優勢是它們為讀和寫分別提供了鎖,它能滿足你寫像ConcurrentHashMap這樣的高效能資料結構和有條件的阻塞。Java執行緒面試的問題越來越會根據面試者的回答來提問。我強烈建議在你去參加多執行緒的面試之前認真讀一下Locks,因為當前其大量用於構建電子交易終統的客戶端快取和交易連線空間。

 3)什麼是原子操作,Java中的原子操作是什麼?

cpu在一個時間片內可以完成的操作,我們來看一下度娘百科的說法:

原子操作(atomic operation)是不需要synchronized",這是Java多執行緒程式設計的老生常談了。所謂原子操作是指不會被執行緒排程機制打斷的操作;這種操作一旦開始,就一直執行到結束,中間不會有任何 context switch (切換到另一個執行緒)

4) 為什麼我們呼叫start()方法時會執行run()方法,為什麼我們不能直接呼叫run()方法?

原文引用:這是另一個非常經典的java多執行緒面試問題。這也是我剛開始寫執行緒程式時候的困惑。現在這個問題通常在電話面試或者是在初中級Java面試的第一輪被問到。這個問題的回答應該是這樣的,當你呼叫start()方法時你將建立新的執行緒,並且執行在run()方法裡的程式碼。但是如果你直接呼叫run()方法,它不會建立新的執行緒也不會執行呼叫執行緒的程式碼。閱讀我之前寫的《start與run方法的區別》這篇文章來獲得更多資訊。

詳細解答:之所以出現執行緒,就是為了更好的利用CPU,讓她更加“精明”的幹活。 通過呼叫Thread類的start()方法來啟動一個執行緒, 這時此執行緒是處於就緒狀態, 並沒有執行。 然後通過此Thread類呼叫方法run()來完成其執行操作的, 這裡方法run()稱為執行緒體, 它包含了要執行的這個執行緒的內容, Run方法執行結束, 此執行緒終止, 而CPU再執行其它執行緒, 而如果直接用Run方法, 這只是呼叫一個方法而已, 程式中依然只有主執行緒--這一個執行緒, 其程式執行路徑還是隻有一條, 這樣就沒有達到寫執行緒的目的。

個人理解:其實自己寫一個簡單點的程式就知道區別了,在main中如果直接呼叫run() 那跟正常的程式沒什麼區別,方法的執行順序與方法的前後順序有關~

5)在java中wait和sleep方法的不同?


原文引用:通常會在電話面試中經常被問到的Java執行緒面試問題。最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。Wait通常被用於執行緒間互動,sleep通常被用於暫停執行。


詳細解答:sleep是執行緒被呼叫時,佔著cpu去睡覺,其他執行緒不能佔用cpu,os認為該執行緒正在工作,不會讓出系統資源,wait是進入等待池等待,讓出系統資源,其他執行緒可以佔用cpu