wait,notify,sleep,join這幾個方法很常用,這里涉及到多線程和同步問題,這里稍微解釋一下.
1.wait和notify
這兩個方法都是Object中的方法,放在一塊是因為他們關系非常密切.
wait就是等待這個對象的同步鎖,不過調用這個方法必須先獲得這個對象的同步鎖,就這一點很多人就搞暈了.
這里先解釋一下這兩個方法,然后給出一個小例子說明.
wait:等待對象的同步鎖,需要獲得該對象的同步鎖才可以調用這個方法,否則后收到一個IllegalMonitorStateException,這個是運行時異常.調用這個方法后,就放棄了這個同步鎖了.假如不帶參數的wait方法就只有等別人喚醒了,假如帶一個參數的
化就設置等待最長時間,過了這個時間即使沒有人喚醒這個線程也不再等待了.
notify:喚醒在等待該對象同步鎖的線程(只喚醒一個,假如有多個在等待),但是notifyAll可以喚醒所有等待的線程,注重喚醒的時在notify之前wait的線程,之后的沒有效果.
這里舉一個通俗的例子,兩個人共有一個衛生間(每次只能一個人用),他們都要刷牙和方便,他們是這樣約定的,輪流用,第一個人先刷牙,然后第二個人刷牙...
class Syn
{
public static void main(String[] args) throws Exception
{
TwoPeople.ONE.start();
TwoPeople.TWO.start();
}
}
class TwoPeople extends Thread
{
PRivate int i=0;
static Thread ONE=new TwoPeople(1);
static Thread TWO=new TwoPeople(2);
static Object washroom=new Object();
private TwoPeople(int i){this.i=i;}
public void run(){
synchronized(washroom){
try{
if(i==1){
brush(); //1
washroom.wait(); //2
release(); //6
washroom.notify(); //7
}
else{
brush(); //3
washroom.notify(); //4
washroom.wait(); //5
release(); //8
新聞熱點
疑難解答