[wait and notify]
你可以利用這兩個(gè)方法很好的控制線程的執(zhí)行流程,當(dāng)線程調(diào)用wait方法后,線程將被掛起,直到被另一線程喚醒(notify)或則是如果wait方法指定有時(shí)間得話,在沒有被喚醒的情況下,指定時(shí)間時(shí)間過后也將自動(dòng)被喚醒。但是要注意一定,被喚醒并不是指馬上執(zhí)行,而是從組塞狀態(tài)變?yōu)榭蛇\(yùn)行狀態(tài),其是否運(yùn)行還要看cpu的調(diào)度。
事例代碼:
class MyThread_1 extends Thread
{
Object lock;
public MyThread_1(Object o)
{
lock=o;
}
public void run()
{
try
{
synchronized(lock)
{
System.out.println("Enter Thread_1 and wait");
lock.wait();
System.out.println("be notified");
}
}catch(InterruptedException e){}
}
}
class MyThread_2 extends Thread
{
Object lock;
public MyThread_2(Object o)
{
lock=o;
}
public void run()
{
synchronized(lock)
{
System.out.println("Enter Thread_2 and notify");
lock.notify();
}
}
}
public class MyThread
{
public static void main(String[] args)
{
int[] in=new int[0];//notice
MyThread_1 t1=new MyThread_1(in);
MyThread_2 t2=new MyThread_2(in);
t1.start();
t2.start();
}
}
執(zhí)行結(jié)果如下:
Enter Thread_1 and wait
Enter Thread_2 and notify
Thread_1 be notified
可能你注意到了在使用wait and notify方法得時(shí)候我使用了synchronized塊來包裝這兩個(gè)方法,這是由于調(diào)用這兩個(gè)方法的時(shí)候線程必須獲得鎖,也就是上面代碼中的lock[],如果你不用synchronized包裝這兩個(gè)方法的得話,又或則鎖不一是同一把,比如在MyThread_2中synchronized(lock)改為synchronized(this),那么執(zhí)行這個(gè)程序的時(shí)候?qū)?huì)拋出java.lang.IllegalMonitorStateException執(zhí)行期異常。另外wait and notify方法是Object中的,并不在Thread這個(gè)類中。最后你可能注意到了這點(diǎn):int[] in=new int[0];為什么不是創(chuàng)建new Object而是一個(gè)0長(zhǎng)度的數(shù)組,那是因?yàn)樵趈ava中創(chuàng)建一個(gè)0長(zhǎng)度的數(shù)組來充當(dāng)鎖更加高效。
Thread作為java中一重要組成部分,當(dāng)然還有很多地方需要更深刻的認(rèn)識(shí),上面只是對(duì)Thread的一些常識(shí)和易錯(cuò)問題做了一個(gè)簡(jiǎn)要的總結(jié),若要真正的掌握java的線程,還需要自己多做總結(jié)
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |