Java Thread sleep和wait的區別
阿新 • • 發佈:2019-02-10
我們在編寫Java執行緒程式的時候,經常忽略sleep 和 wait方法的區別,導致一些非常棘手的問題,因此瞭解這兩種方法區別有助於我們編寫出更加優質的程式。
區別:
sleep() | wait() |
sleep為Thread類的方法,用來控制執行緒自身流程 | wait為object類的方法,主要用於執行緒間通訊 |
sleep()睡眠時,保持物件鎖 | wait()睡眠時,釋放物件鎖,使當前擁有該物件鎖的執行緒等待,直到其他執行緒呼叫notify喚醒(備註:也可以使用超時喚醒) |
不能訪問同步程式碼塊 | 能夠訪問同步程式碼塊 |
程式碼:
package com.jony.test; public class ThreadTest implements Runnable { int number = 10; public void firstMethod() throws Exception { System.out.println("first"); System.out.println(Thread.currentThread()); System.out.println(this); synchronized (this) { number += 100; System.out.println(number); notify(); } } public void secondMethod() throws Exception { System.out.println("second"); System.out.println(Thread.currentThread()); System.out.println(this); synchronized (this) { /* * sleep()睡眠時,保持物件鎖,仍然佔有該鎖; 而wait()睡眠時,釋放物件鎖。 因此: * (1)sleep不會訪問其他同步程式碼塊 * (2)wait 則會訪問其他同步程式碼塊 * (休息2S,阻塞執行緒) * 以驗證當前執行緒物件的鎖被佔用時, 是否可以訪問其他同步程式碼塊 */ //Thread.sleep(2000); //this.wait(2000);//只能在同步程式碼塊中呼叫wait方法 this.wait(); System.out.println("Before: " + number); number *= 200; System.out.println("After: " + number); } } @Override public void run() { try { firstMethod(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { ThreadTest threadTest = new ThreadTest(); Thread thread = new Thread(threadTest); System.out.println(Thread.currentThread()); //thread.run(); // 不會建立新執行緒,直接呼叫run方法 thread.start();// 開始執行該執行緒(建立一個新執行緒),由Java虛擬機器呼叫該執行緒的run方法 //Thread.sleep(1000); threadTest.secondMethod(); } }