當執行緒呼叫yield方法後,執行緒即從執行狀態變為可執行狀態,將cpu的執行權讓給同級別的執行緒;讓出cpu執行權之後,又同別的執行緒共同爭奪cpu的執行權。(可能釋放了cpu執行權之後 又搶到了;同時多執行緒之前是搶占cpu的,所以從執行結果上很難看出是否yield方法起了作用)public class yielddemo extends thread
} public static void main(string args)
class demo extends thread
} }}
執行結果:運**況:使當前的執行緒休眠,狀態由執行態轉變為可執行態,讓出cpu執行權。等待休眠時間結束,再次執行。(執行緒雖然休眠了 但並沒有釋放鎖---------0正在執行------
*****====0正在執行*****=
---------1正在執行------
*****====1正在執行*****=
---------2正在執行------
*****====2正在執行*****=
---------3正在執行------
*****====3正在執行*****=
---------4正在執行------
*****====4正在執行*****=
*****====5正在執行*****=
---------5正在執行------
)
舉例如下:
public class sleepdemo2 catch (interruptedexception e) }}
}, "執行緒1").start();
new thread(new runnable()
}}, "執行緒2").start();
}}
運**況如下:
等待呼叫該方法的執行緒執行完畢之後,再執行其他執行緒,其內部是wait實現的,因此它會釋放物件鎖測試sleep不會釋放鎖
等待sleep釋放鎖沒有指望了
運**況:class runnableimpl implements runnable catch (interruptedexception e) }}
class threadtest extends thread
@override
public void run() catch (interruptedexception ex)
system.out.println("releaseobjectlock");
} }}public class jointestdemo2 catch (interruptedexception e)
}}
wait導致當前的執行緒等待,直到其他執行緒呼叫此物件的getobjectlock
begin sleep
end sleep
releaseobjectlock
joinfinish
notify()
方法或notifyall()
方法。會釋放物件鎖notify隨意喚醒乙個等待的執行緒
nofityall將所有等待的執行緒均喚醒
可以使用三者構造乙個簡單的生產者和消費者場景
中斷執行緒,將執行緒的狀態置為中斷(true),不影響執行緒的正常執行。當interrupt碰到了sleep、wait、join時會丟擲interruptedexception異常,並將中斷狀態清除(中斷狀態為false)。public class waitdemo
class producer implements runnable catch (interruptedexception e)
}random random = new random();
int num = random.nextint();
list.add(num);
system.out.println("生產者生產資料:" + num);
list.notifyall();}}
} }class consumer implements runnable catch (interruptedexception e)
}system.out.println("消費了資料:" + list.remove());
list.notifyall();}}
} }}
isinterrupted()
測試執行緒是否已經中斷。
interrupted()
測試當前執行緒是否已經中斷。
上述兩個方法分別是判斷執行緒是否已經中斷,返回值true/false。但是兩個方法是有一定的區別的
首先給出兩個方法的實現:
兩個方法的共同點均是呼叫了本地方法isinterrupted,只是傳遞的引數不一樣。通過檢視引數 我們也能看出兩個方法的不同。clearinterrupted 清除中斷狀態(true清除,false不清除)public boolean isinterrupted()
public static boolean interrupted()
private native boolean isinterrupted(boolean clearinterrupted);
而isinterrupted()傳遞的是false,interrupted傳遞的是true
所以isinterrupted()只是單純的獲取執行緒的中斷狀態,而interrupted()方法 第一次呼叫獲取的是執行緒的中斷狀態,隨後清除中斷狀態(狀態置為false),第二次呼叫時中斷狀態為false
**展示:
public class interruptdemo implements runnable
@override
public void run() catch (interruptedexception e)
}}
isinterrupted:false
interrupted:false
in run() - interrupted while sleeping
主線程是否中斷:true
主線程是否中斷:false
主線程上述例子驗證了interrupted方法,但是為什麼isinterrupted方法返回的是false呀,明明中斷了呀?
還記得上面描述的嗎?當interrupt方法碰到sleep、wait、join即丟擲異常,清除中斷狀態(true-->false)。所以返回的是fasle
若想通過true、false判斷是否中斷執行緒,則需要再呼叫一次interrupt方法。
public class interruptdemo implements runnable
@override
public void run() catch (interruptedexception e)
}}
運**況:
thread-0正在執行
主線程是否中斷:true
主線程是否中斷:false
主線程isinterrupted:true
interrupted:true
in run() - interrupted while sleeping
java中常用的String方法
1 length 字串的長度 string a hello word system.out.println a.length 輸出的結果是字串長度10。2 charat 擷取乙個字元 string a hello word system.out.println a.charat 1 輸出的結果是字串...
java中常用的String方法
1 length 字串的長度 string a hello word system.out.println a.length 輸出的結果是字串長度10。2 charat 擷取乙個字元 string a hello word system.out.println a.charat 1 輸出的結果是字串...
java 開發中常用方法
從list中拿出top指的條數資料 我有幾張阿里雲幸運券分享給你,用券購買或者公升級阿里雲相應產品會有特惠驚喜哦!把想要買的產品的幸運券都領走吧!快下手,馬上就要搶光了。取top x條產品類資料 param sourlist 產品類集合 param rowscount 條數 return list ...