程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> wait、notify、sleep、interrupt對比分析

wait、notify、sleep、interrupt對比分析

編輯:關於JAVA
 

對比分析Java中的各個線程相關的wait()、notify()、sleep()、interrupt()方法

方法簡述

Thread類

  • sleep:暫停當前正在執行的線程;(類方法
  • yield:暫停當前正在執行的線程,並執行其他線程;(類方法
  • join:等待該線程終止;
  • interrupt:中斷該線程,當線程調用wait(),sleep(),join()或I/O操作時,將收到InterruptedException或 ClosedByInterruptException;

Object類

  • wait:暫停當前正在執行的線程,直到調用notify()或notifyAll()方法或超時,退出等待狀態;
  • notify:喚醒在該對象上等待的一個線程;
  • notifyAll:喚醒在該對象上等待的所有線程;

詳細分析

sleep VS wait

sleep()和wait()方法都是暫停當前正在執行的線程,出讓CPU資源。

方法 所屬類 方法類型 鎖 解除方法 場景 用途 sleep Thread 靜態方法 不釋放鎖 timeout,interrupt 無限制 線程內的控制 wait Object 非靜態方法 釋放鎖 timeout,notify,interrupt 同步語句塊 線程間的通信
public static void sleep(long millis) throws InterruptedException
public static void sleep(long millis, int nanos) throws InterruptedException

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

wait && notify

調用對象的wait()、notify()、notifyAll()方法的線程,必須是作為此對象監視器的所有者。常見的場景便是就是synchronized關鍵字的語句塊內部使用這3個方法,如果直接在線程中使用wait()、notify()、notifyAll()方法,那麼會拋出異常IllegalMonitorStateException,拋出的異常表明某一線程已經試圖等待對象的監視器,或者試圖通知其他正在等待對象的監視器而本身沒有指定監視器的線程。。

調用wait()方法的線程,在調用該線程的interrupt()方法,則會重新嘗試獲取對象鎖。只有當獲取到對象鎖,才開始拋出相應的異常,則執行該線程之後的程序。

interrupt

interrupt()方法的工作僅僅是改變中斷狀態,並不是直接中斷正在運行的線程。中斷的真正原理是當線程被Object.wait(),Thread.join()或sleep()方法阻塞時,調用interrupt()方法後改變中斷狀態,而wait/join/sleep這些方法內部會不斷地檢查線程的中斷狀態值,當發現中斷狀態值改變時則拋出InterruptedException異常;對於沒有阻塞的線程,調用interrupt()方法是沒有任何作用。

yield

yield()方法使當前線程出讓CPU執行時間,當並不會釋放當前線程所持有的鎖。執行完yield()方法後,線程從Running狀態轉變為Runnable狀態,既然是Runnable狀態,那麼也很可能馬上會被CPU調度再次進入Running狀態。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved