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

1.Object類線程

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

notify接口

notifyAll資源

 

(1)notifyget

  public final native void notify();同步

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

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

喚醒的線程不會當即執行,它會與其餘線程一塊兒,爭奪資源yield

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() 

相關文章
相關標籤/搜索