java線程1-基礎

線程

  1. 程序

  2. 進程: 資源分配的基本單位。它擁有一個完整的虛擬地址空間。當進程發生調度時,不同的進程擁有不同的虛擬地址空間

  3. 線程: 有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。

     	* 線程是進程中的一個實體,是被系統cup獨立**分配**和獨立**調度**的基本單位			   
     	* 線程與資源分配無關,線程自己不擁有系統資源,依附於進程
     	* 它可與同屬一個進程的其它線程共享進程所擁有的全部資源
     	* 一個線程可以創建和撤消另一個線程
     	* 同一進程中的多個線程之間可以併發執行
     	* 通常是在一個進程中包括多個線程,每個線程都是作爲利用CPU的基本單位,是花費最小開銷的實體
    
  4. 併發:當有多個線程在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間 段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處於掛起狀。.這種方式我們稱之爲併發(Concurrent)。

  5. 並行:當系統有一個以上CPU時,則線程的操作有可能非併發。當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶佔CPU資源,可以同時進行,這種方式我們稱之爲並行(Parallel)。

創建方式

  1. 繼承Thread
  2. 實現Runnable
  3. 匿名內部類
  4. lambda表達式
  5. 實現Callable FutureTask Thread(futureTask)
  6. Timer TimerTask (quartz)
  7. spring @EnableAsync @Async

常見方法

類方法(靜態)

  1. Thread.sleep(long mi); //休眠
    進入阻塞狀態,釋放cup,不會釋放鎖
  2. Thread.currentThread(); //當前線程
  3. Thread.yield(); //native 方法
    執行狀態中,變成可執行狀態,不確定釋放釋放鎖~~
  4. Thread.interrupted(); ()->boolean

對象方法 : t = new Thread();

  1. t.start() ; // 開啓線程

     只能start一次,java.lang.IllegalThreadStateException
    
  2. t.getName(); //當前線程的名字

  3. t.getPriority(); //優先級

     【1,10】(默認值爲5)Thread.MIN_PRIORITY, Thread.NORM_PRIORITY , Thread. MAX_PRIORITY
      越高不能保證,必定先執行,雖然概率低了點,但總會有他執行的機會
    
  4. t.setDaemon(true) ; //

     設置守護線程  
     GC:垃圾回收器,他是一個守護線程,一般的Thread 都是用戶線程 ; 當全部用戶線程dead , 守護線程自行關閉
    
  5. t.join();

     	加入到默認(當前)線程,當前線程進入阻塞狀態,t線程執行.
    
  6. t.interrupt() // 中斷 , this.isInterrupted() true

     this.isInterrupted() true
     如果線程在sleep,wait , 會拋異常 
     	java.lang.InterruptedException: sleep interrupted
     	java.lang.InterruptedException
    
  7. t.isInterrupted(); ()->boolean 是否中斷, 和

  8. t.isAlive() //native

廢棄方法

  1. t.stop(); //立即停止當前線程, 後續代碼不會執行,即使線程在阻塞狀態也不會拋異常,有可能資源未釋放

生命週期

週期

  1. NEW:通過New關鍵字創建了Thread類(或其子類)的對象。

  2. RUNNABLE:這種情況指的是Thread類的對象調用了start()方法,這時的線程就等待時間片輪轉到自己這,以便獲得CPU;第二種情況是線程在處於RUNNABLE狀態時並沒有運行完自己的run方法,時間片用完之後回到RUNNABLE狀態;還有種情況就是處於BLOCKED狀態的線程結束了當前的BLOCKED狀態之後重新回到RUNNABLE狀態。

  3. RUNNING:獲得CPU的RUNNABLE線程,執行程序指令。

  4. BLOCKED:處於RUNNING狀態的線程,出於某種原因,而讓出當前的CPU給其他的線程。

  5. DEAD:處於RUNNING狀態的線程,在執行完run方法之後,就變成了DEAD狀態了。
    生命週期
    當共享資源被多個線程併發訪問時,通過對象鎖控制,其中一個線程獲取對象鎖時,其他線程就進入了一個鎖池(Lock pool);當鎖被釋放,另一個線程獲得了鎖,就變爲可運行狀態。

    主要是wait和notify方法。線程調用了wait()方法之後,釋放掉鎖,進入等待池(Wait pool) ;收到通知之後等待獲取鎖,獲取鎖之後纔可以運行。

阻塞 blocked

1.調用sleep(毫秒數),使線程進入睡眠狀態。在規定時間內,這個線程是不會運行的。
2.調用join([毫秒數]),當前線程進入阻塞狀態,直到join的線程執行完畢或指定毫秒數之後。
3.用wait()暫停了線程的執行。除非線程收到 notify()或 notifyAll()消息,否則不會變成“可運行”狀態。
4. 線程正在等候一些IO操作完成。
5. 線程試圖調用另一個對象的“同步”方法,但那個對象處於鎖定狀態,暫時無法使用。
Wait pool 等待池   Lock pool 鎖池

線程狀態

  1. BLOCKED
    受阻塞並且正在等待監視器鎖的某一線程的線程狀態。
  2. NEW
    至今尚未啓動的線程的狀態。
  3. RUNNABLE
    可運行線程的線程狀態。
  4. TERMINATED
    已終止線程的線程狀態。
  5. TIMED_WAITING
    具有指定等待時間的某一等待線程的線程狀態。
  6. WAITING
    某一等待線程的線程狀態。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章