wait,notify,sleep,join這幾個(gè)方法很常用,這里涉及到多線程和同步問題,這里稍微解釋一下.
1.wait和notify
這兩個(gè)方法都是Object中的方法,放在一塊是因?yàn)樗麄冴P(guān)系非常密切.
wait就是等待這個(gè)對(duì)象的同步鎖,不過調(diào)用這個(gè)方法必須先獲得這個(gè)對(duì)象的同步鎖,就這一點(diǎn)很多人就搞暈了.
這里先解釋一下這兩個(gè)方法,然后給出一個(gè)小例子說明.
wait:等待對(duì)象的同步鎖,需要獲得該對(duì)象的同步鎖才可以調(diào)用這個(gè)方法,否則后收到一個(gè)IllegalMonitorStateException,這個(gè)是運(yùn)行時(shí)異常.調(diào)用這個(gè)方法后,就放棄了這個(gè)同步鎖了.假如不帶參數(shù)的wait方法就只有等別人喚醒了,假如帶一個(gè)參數(shù)的
化就設(shè)置等待最長(zhǎng)時(shí)間,過了這個(gè)時(shí)間即使沒有人喚醒這個(gè)線程也不再等待了.
notify:喚醒在等待該對(duì)象同步鎖的線程(只喚醒一個(gè),假如有多個(gè)在等待),但是notifyAll可以喚醒所有等待的線程,注重喚醒的時(shí)在notify之前wait的線程,之后的沒有效果.
這里舉一個(gè)通俗的例子,兩個(gè)人共有一個(gè)衛(wèi)生間(每次只能一個(gè)人用),他們都要刷牙和方便,他們是這樣約定的,輪流用,第一個(gè)人先刷牙,然后第二個(gè)人刷牙...
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
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注