java多線程

1、多線程的優點:1.防止阻塞 2.併發執行,充分利用CPU,提高程序效率 


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()方法來控制併發線程的執行。



























































    




   

發佈了37 篇原創文章 · 獲贊 12 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章