在Java中,有兩種常用的暫停線程的方式:sleep和wait。
sleep方法是Thread類自帶的方法,它可以讓當(dāng)前線程暫停一段時(shí)間。其常用語法如下:
try { Thread.sleep(1000);//暫停1000毫秒,即1秒鐘 } catch (InterruptedException e) { e.printStackTrace(); }
在實(shí)際應(yīng)用中,sleep方法的作用比較有限,因?yàn)樗煌V沽水?dāng)前線程,不會(huì)釋放對(duì)象鎖,也不會(huì)通知其他線程,因此其他線程還是會(huì)繼續(xù)競(jìng)爭同一資源。
相比之下,wait方法可以讓線程暫停并釋放對(duì)象鎖,同時(shí)還可以使線程掛起直到其他線程喚醒它。其常用語法如下:
synchronized(object){ try { object.wait();//線程掛起等待喚醒 } catch (InterruptedException e) { e.printStackTrace(); } }
需要注意的是,wait方法必須在對(duì)共享資源進(jìn)行同步的情況下才能調(diào)用。如果當(dāng)前線程沒有獲得對(duì)象鎖,那么它就不能調(diào)用wait方法。
在多線程并發(fā)執(zhí)行的程序中,wait和notify的應(yīng)用非常廣泛。其中,wait一般用在線程間等待某個(gè)條件的出現(xiàn),而notify則是在某個(gè)條件出現(xiàn)(或操作完成)時(shí)通知正在掛起等待的線程。