Java多線程相關方法(Object類和Thread類)


1.Object類

wait(空參的)線程進入waiting狀態(有參的)線程進入timed_waiting狀態

notify

notifyAll

 

(1)notify

  public final native void notify();

調用一個Object對象的notify()方法,就會喚醒一個正在等待該線程的鎖的線程

(當前可能會有好幾個線程調用了該Object對象的重載的wait方法,等待喚醒,該方法只能喚醒一個,隨機的)

喚醒的線程不會立即執行,它會與其他線程一起,爭奪資源

notify方法只能被持有該Object對象鎖的線程調用

如何獲得對象的鎖?

(1)執行該對象的同步實例方法

(2)執行該類的同步靜態方法

(3)執行該對象的同步代碼塊

同一時刻,只有一個線程擁有一個對象的鎖

如果當前線程沒有持有該對象的鎖,拋出異常:IllegalMonitorStateException 

 

(2)notifyAll

  public final native void notifyAll();

調用一個Object對象的notifyAll方法,會喚醒所有等待當前對象的鎖的線程

調用該方法的線程必須持有當前對象的鎖

喚醒所有等待該對象的鎖之后,一起爭奪鎖

 

(3)空參wait() 相當於 wait(0)

調用一個Object對象的空參的wait()方法,會導致當前線程進入等待(waiting)狀態,直到另一個線程調用該Object對象的notify()或者notifyAll()方法

調用wait方法時,當前線程必須持有該Object對象的鎖

調用該方法之后,調用該方法的線程進入該Object對象的等待池,並放棄該對象上的所有鎖

InterruptedException

IllegalMonitorStateException

 

public final void wait() throws InterruptedException {
  wait(0);
}

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException{……}

 

(4)一個參數的wait(?)

  調用一個Object對象的wait(?)方法,會導致當前線程進入超時等待(timed_waiting)狀態

  *調用notify

  *調用notifyAll()

  *調用interrupt

  *等待時間到

 

2.Thread類

  run

  start

  sleep(沒有空參的,只有有參的)線程進入timed_waiting狀態

  interrupt

  yeild

  join(空參的)線程進入waiting狀態(有參的)線程進入timed_waiting狀態

(1)start

使當前線程開始執行

調用start方法之后,JVM會調用當前線程的run方法

(2)run

如果當前線程實現了Runnable接口,則接口實現類的run方法被調用

如果直接調用run方法,不能啟動一個線程,相當於調用了一個普通方法

(3)sleep

沒有空參的方法

使線程進入TIMED_WAITING狀態

public static native void sleep(long millis) throws InterruptedException;

public static void sleep(long millis, int nanos)throws InterruptedException {……}

使當前正在執行的線程休眠(暫停執行)指定的毫秒數

受到系統定時器和調度器精度和准確度的影響

當前線程休眠指定的毫秒數,在休眠期間不會釋放它已經持有的任何鎖

InterruptedException(當前正在休眠的線程被其它線程打斷)

IllegalArgumentException(參數無效)

(4)join

public final void join() throws InterruptedException {
  join(0);
}

public final synchronized void join(long millis) throws InterruptedException

public final synchronized void join(long millis, int nanos) throws InterruptedException

在當前線程內調用其它線程的join方法,當前線程進入Waiting或者TIMED_WAITING狀態

釋放已經持有的對象鎖

等待時間到或者其它線程執行完畢,當前線程進入就緒狀態

 

(5)yield

讓步,從而讓其他具有相同優先級的線程獲取執行權,但是,並不能保證當前線程調用yield之后,其它具有相同優先級的線程就一定能獲得執行權

提示調度器當前線程願意讓出當前正在使用的處理器

調度器可以忽略該提示

線程從執行狀態變成就緒狀態

public static native void yield();

不會釋放鎖

 

(6)interrupt

將線程的中斷狀態設為true

並不會立刻終止線程

判斷是否中斷:

 

判斷當前線程是否中斷,並清除中斷標志

public static boolean interrupted() {
return currentThread().isInterrupted(true);
}

判斷方法調用線程是否中斷,不清楚中斷標志

public boolean isInterrupted() {
return isInterrupted(false);
}

 

Object wait  VS Thread sleep

(1)sleep沒有空參的重載形式

(2)wait釋放鎖   sleep持有鎖

(3)空參的sleep,使線程進入waiting狀態

(4)有參的wait和sleep,都會使線程進入TIMED_WAITING狀態

(5)都有InterruptedException

 

Object wait  VS Thread yield

(1)wait釋放鎖

(2)yield不釋放鎖

(3)wait釋放鎖,使當前線程進入等待狀態

(4)yield不釋放鎖,使當前線程進入就緒狀態

(5)wait會使所有等待該對象鎖的線程都爭奪資源

(6)yield只會使同一優先級的就緒的線程爭奪資源

 

Tread.currentThread(0.getName();

isLive() 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM