----------- android培訓、java培訓、java學習型技術博客、期待與您交流! ------------
package com.itcast.test2;
/**
* wait方法和sleep方法有什麼作用,區別是什麼?
* sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,
* 但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。
* wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,
* 進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後
* 本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。)
* @author shandawang
*
*/
public class MultiThread {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new Thread1()).start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(new Thread2()).start();
}
private static class Thread1 implements Runnable
{
@Override
public void run() {
// TODO Auto-generated method stub
//由於這裏的Thread1和下面的Thread2內部run方法要用同一對象作爲監視器,我們這裏不能用this,
//因爲在Thread2裏面的this和這個Thread1的this不是同一個對象。我們用MultiThread.class這個
//字節碼對象,當前虛擬機裏引用這個變量時,指向的都是同一個對象。
synchronized (MultiThread.class) {
System.out.println("enter thread1...");
System.out.println("thread1 is waiting");
try {
//釋放鎖有兩種方式,第一種方式是程序自然離開監視器的範圍,也就是離開了synchronized關鍵字管轄的
//代碼範圍,另一種方式就是在synchronized關鍵字管轄的代碼內部調用監視器對象的wait方法。這裏,使用wait方法釋放鎖。
MultiThread.class.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread1 is going on...");
System.out.println("thread1 is being over!");
}
}
}
private static class Thread2 implements Runnable
{
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (MultiThread.class) {
System.out.println("enter thread2...");
System.out.println("thread2 notify other thread can release wait status..");
//由於notify方法並不釋放鎖, 即使thread2調用下面的sleep方法休息了500毫秒,但thread1仍然
//不會執行,因爲thread2沒有釋放鎖,所以Thread1無法得不到鎖。
MultiThread.class.notify();
// System.out.println("thread2 is sleeping ten millisecond...");
System.out.println("thread2 is waiting, other thread can run now...");
try {
//Thread.sleep(10);
MultiThread.class.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread2 is going on...");
System.out.println("thread2 is being over!");
}
}
}
}
----------- android培訓、java培訓、java學習型技術博客、期待與您交流! ------------