Java——瞭解一下Java中的線程

線程屬於某個進程,通過一個進程中的線程共享所屬進程的資源;


  • Java中線程:
    a.java.lang.Thread類的一個實例;
    b.線程的執行;
    繼承java.lang.Thread類:
    實現java.lang.Runnable接口:
  • 主線程:main方法;
  • 一個線程有一個調用棧,沒創建一個新線程就會產生一個新的調用棧;
  • 線程總體分類:
    用戶線程:用戶線程執行完畢,JVM自動關閉;
    守護線程:獨立於JVM,一般由操作系統或用戶創建;
  • Thread對象調用start()方法纔會啓動線程,而不是通過run()或者其他的方法;
    start()方法調用前線程屬於new的狀態只有一個Thread對象,並沒有真正的線程;
    start()調用後:啓動新的執行線程伴隨着新的調用棧,該線程從new的狀態轉到
    runnable狀態,當線程獲得機會執行時,便進入run()方法中運行;
    run()方法類似於main方法只是一個入口,線程有機會執行時會去調用run方法執行,因此在runnable或thread上調用run是合法的,但並沒什麼卵用,也不會啓動新的線程,所以run只是一個簽名,告訴線程從這裏進入執行;線程一旦啓動就永遠不能重新啓動,一旦啓動就進入就緒的狀態,即可運行的狀態;
  • 線程的調度不可控,但可以通過特定的操作影響其調度方式;

線程生命週期
線程生命週期

  1. 線程通過new()方法創建(有兩種方式),調用start()方法,進入就緒狀態(runnable狀態),等待系統的調度(時間片輪轉調度),當系統調度,線程獲取cpu時間片進入運行狀態(running)。線程執行完畢,進入死亡狀態。
  2. 處於運行狀態的線程若遇到**sleep()**方法(Thread的靜態方法),則線程進入睡眠狀態(blocked),不會釋放鎖,sleep()方法結束,線程轉爲就緒狀態,等待系統重新調度(所以sleep()結束不一定會立即執行)。
  3. 處於運行狀態的線程有io操作或者有其他線程的join()方法,也會進入阻塞狀態(blocked)【關於join方法,join方法用得不多,當A線程執行到了B線程的join()方法時,A就會等待,等B線程都運行完,A線程纔會執行。使用join()方法時,會產生異常】。
  4. 處於運行狀態的線程yield()方法,線程轉爲就緒狀態。(yield只讓給優先級比自己高的線程
  5. 處於運行狀態的線程遇到wait() 方法(object的方法),線程處於等待狀態,需要notify()/notifyALL()來喚醒線程,喚醒後的線程處於鎖定狀態,獲取了“同步鎖”,之後,線程才轉爲就緒狀態。
  6. 處於運行的線程synchronized,加上後 變成同步操作。處於鎖定狀態,獲取了“同步鎖”,之後,線程才轉爲就緒狀態。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章