1. 程式人生 > >Java Thread sleep和wait的區別

Java Thread sleep和wait的區別

我們在編寫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();
	}
}