所以sleep()和wait()方法的最大差異是:
##·sleep()睡眠時,保持物件鎖定,仍佔有該鎖定;
·而wait()睡眠時,釋放物件鎖定。
·但是wait()和sleep()都可以透過interrupt()方法打斷執行緒的暫停狀態,讓執行緒立刻拋出InterruptedException(但不建議使用該方法)。
/** * Created by jiankunking on 2018/4/5. */ public class ThreadTest implements Runnable { int number = 10; public void addHundred() throws Exception { System.out.println("addHundred begin"); synchronized (this) { number += 100; System.out.println("addHundred:" + number); } System.out.println("addHundred end"); } public void wait2Seconds() throws Exception { System.out.println("wait2Seconds begin "); synchronized (this) { /** * (休息2S,阻塞线程) * 以验证当前线程对象的机锁被占用时, * 是否被可以访问其他同步代码块 */ System.out.println(".............wait begin.................."); this.wait(2000); number *= 200; System.out.println(".............wait end.................."); } System.out.println("wait2Seconds end "); } public void sleep2Seconds() throws Exception { System.out.println("sleep2Seconds begin "); synchronized (this) { /** * (休息2S,阻塞线程) * 以验证当前线程对象的机锁被占用时, * 是否被可以访问其他同步代码块 */ System.out.println("............sleep begin..................."); Thread.sleep(2000); number *= 200; System.out.println(".............sleep end.................."); } System.out.println("sleep2Seconds end "); } @Override public void run() { try { addHundred(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { ThreadTest threadTest = new ThreadTest(); Thread thread = new Thread(threadTest); thread.start(); //threadTest.sleep2Seconds(); //threadTest.wait2Seconds(); } }
number*200+100;
number+100;
Java中sleep方法的幾個注意點:
1、Thread.sleep()方法用來暫停執行緒的執行,將CPU放給線程調度器。 2、Thread.sleep()方法是一個靜態方法,它暫停的是目前執行的執行緒。 3、Java有兩種sleep方法,一個只有一個毫秒參數,另一個有毫秒和奈秒兩個參數。 4、與wait方法不同,sleep方法不會釋放鎖定。 5、如果其他的執行緒中斷了一個休眠的線程,sleep方法會拋出Interrupted Exception。 6、休眠的執行緒在喚醒之後不保證能取得CPU,它會先進入就緒態,與其他執行緒競爭CPU。 7、有一個易錯的地方,當呼叫t.sleep()的時候,會暫停執行緒t。這是不對的,因為Thread.sleep是一個靜態方法,它會使當前執行緒而不是執行緒t進入休眠狀態。 8、wait方法必須正在同步環境下使用,例如synchronized方法或同步程式碼區塊。如果你不在同步條件下使用,會拋出IllegalMonitorStateException異常。另外,sleep方法不需要再同步條件下調用,你可以任意正常的使用。 9、wait方法用於和定義於Object類別的,而sleep方法操作於當前線程,定義在java.lang.Thread類別裡面。 PHP中文網,有大量免費的JAVA入門教學,歡迎大家學習!
以上是java wait和sleep的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!