一.JavaThread類的幾個(gè)函數(shù)的說明:
1. ?setPriority( ): 設(shè)置線程的優(yōu)先權(quán);
2 . yield( ): 暫停線程的執(zhí)行,給其它具有相同優(yōu)先權(quán)的線程執(zhí)行的機(jī)會(huì),若此時(shí)沒有其它線程執(zhí)行同云,則此線程繼續(xù)執(zhí)行糖权。這個(gè)函數(shù)并不會(huì)釋放鎖住的對(duì)象。
3. ?join( ): 等待加入的線程執(zhí)行完畢才會(huì)執(zhí)行下一個(gè)線程炸站。加入的線程通過interrupt( )來喚醒星澳。
4. ?wait( ): 類似sleep( ), 不同的是,wait( )會(huì)先釋放鎖住的對(duì)象旱易,然后再執(zhí)行等待的動(dòng)作禁偎。注意,這個(gè)函數(shù)屬于Object類阀坏。另外如暖,由于wait( )所等待的對(duì)象必須先鎖住,因此忌堂,它只能用在同步化程序段或者同步化方法內(nèi)盒至,否則,會(huì)拋出異常IllegalMonitorStateException.
二. ?例子:
下面士修,僅對(duì)于wait( ) 和notify( )函數(shù)進(jìn)行測(cè)試枷遂。
這個(gè)例子向讀者展示了生產(chǎn)者--消費(fèi)者關(guān)系。
代碼:
importJava.util.Vector;
public class ThreadWaitNotifyTest {
public static void main(String args[]) {
Vector obj = new Vector();
Thread consumer = new Thread(new Consumer(obj));
Thread producter = new Thread(new Producter(obj));
consumer.start();
producter.start();
}
}
/*消費(fèi)者 */
class Consumer implements Runnable {
private Vector obj;
public Consumer(Vector v) {
this.obj = v;
}
public void run() {
synchronized(obj) {
while (true) {
try {
if (obj.size() ==0){
obj.wait();//本線程(消費(fèi)者)放棄對(duì)象鎖并等待
}
System.out.println("Consumer:goods have been taken");
System.out.println("obj size: " + obj.size());
obj.clear();
obj.notify();//本線程重新就緒
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
/* ?生產(chǎn)者 */
class Producter implements Runnable {
private Vector obj;
public Producter(Vector v) {
this.obj = v;
}
public void run() {
synchronized(obj) {
while (true) {
try {
if (obj.size() !=0){
obj.wait();//本線程(生產(chǎn)者)放棄對(duì)象鎖并等待
}
obj.add(new String("apples"));//生產(chǎn)一個(gè)蘋果
obj.notify();//本線程重新就緒
System.out.println("Producter:obj are ready");
Thread.sleep(500);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
}