2、如何創建一個線程:
1.實現Runnable接口,然後將它傳遞給Thread的構造函數,創建一個Thread對象
public class DisplayMessage implements Runnable { public void run() {//重寫run方法 } }
Runnable hello = new DisplayMessage("Hello");
Thread thread1 = new Thread(hello);
thread1.start(); //啓動線程
2.直接繼承Thread類。
public class GuessANumber extends Thread{public void run() {}}
Thread thread3 = new GuessANumber(27);
thread1.start();
3、線程的生命週期
當我們在java程序中新建一個線程時,狀態是new。調用線程start()方法時。狀態爲Runnable。
線程調度器爲Runnable線程池中的線程分配CPU時間並且將它們的狀態改變爲Running。其他還有
線程時間片用完,IO請求或者線程中斷或打斷會造成阻塞 waiting,Blocked 和Dead。
4、線程之間如何通信的?
wait() notify() notifyAll()方法可以用於線程間通信關於鎖的狀態
5、wait() notify()和notifyAll()必須在同步方法或者同步塊中被調用
6、如何確保線程安全,也就是線程同步?
使用原子類,實現併發鎖,使用volatile關鍵字,使用不變類和線程安全類
7、同步方法和同步塊,哪個更好?
同步塊是更好的選擇,因爲它不會鎖住整個對象。同步方法會鎖住整個對象,哪怕這個類中有多
個不相關的同步塊,這通常會導致他們停止執行並需要等待獲得這個對象的鎖
8、什麼是死鎖?如何分析和避免死鎖?
死鎖是指兩個以上的線程永遠阻塞的情況,這種情況產生至少需要兩個以上的線程和兩個以上的資源。
所有線程都在等待共享資源的釋放
分析死鎖,我們需要查看java應用程序的線程轉儲。需要找出那些狀態爲BLOCKED的線程和他們等待的
資源。每個資源都有一個唯一的id,用這個id我們可以找出哪些線程已經擁有了它的對象鎖。
避免嵌套鎖,只在需要的地方使用鎖和避免無限期等待是避免死鎖的通常方法。
9、什麼是線程池?如何創建一個java線程池?
一個線程池管理了一組工作線程,同時它還包括了一個用於放置等待執行的任務的隊列。
java.util.concurrent.Executors提供了一個java.util.concurrent.Executor接口的實現用於創建線程池。
10、sleep()和yield()的區別
1.sleep() 使當前線程進入停滯狀態,所以執行sleep()的線程在指定的時間內肯定不會執行,同時
sleep函數不會釋放鎖資源
sleep 可使優先級低的線程得到執行的機會,當然也可以讓同優先級和高優先級的有執行機會
2.yield() 只是使當前線程重新回到可執行狀態,有可能在進入可執行狀態後馬上又被執行,只能使
同優先級的線程有執行的機會。同樣不會釋放鎖資源
所以,sleep和yield的區別在於,
1.sleep可以使優先級低的得到執行的機會,而yield只能使同優先級的
線程有執行的機會。
2.sleep()方法會將線程轉入阻塞狀態,直到阻塞時間結束,纔會轉入就緒狀態。
yield()方法會將當前線程直接轉入就緒狀態。
3.sleep()方法聲明拋出了InterruptedException異常,所以調用sleep()方法時要麼捕捉該異常,要麼顯示聲明拋出該異常。
yield()方法則沒有聲明拋出任何異常。
4.sleep()方法比yield()方法有更好的移植性,通常不建議使用yield()方法來控制併發線程的執行。