線程睡眠
如果需要讓當前正在執行的線程暫停一段時間,並進入阻塞狀態,則可以通過調用Thread類的靜態sleep方法來實現。sleep方法的兩種重載形式:
1.static void sleep(long millis):讓當前正在執行的線程暫停millis毫秒,並進入阻塞狀態,該方法受到系統計時器和線程調度器的精度與準確度的影響。
2.static void sleep(long millis,int nanos):讓當前正在執行的線程暫停millis毫秒,並進入阻塞狀態,該方法受到系統計時器和線程調度器的精度與準確度的營銷。
噹噹前線程調用sleep方法進入阻塞狀態後,在其睡眠時間段內,改線程不會獲得執行的機會,即使系統中沒有其他可執行檔線程,處於sleep中的線程也不會執行,因此sleep方法常用來暫停程式的執行。
線程讓步
yield方法是一個和sleep方法有點相似的方法,它也是Thread類提供的一個靜態方法,它可以讓當前正在執行的線程暫停,但它不會阻塞該線程,它只是將該線程轉入就緒狀態。yield只是讓當前線程暫停一下,讓系統的線程調度器重新調度一次,完全可能的情況是:當某個線程調用了yield方法暫停之後,線程調度器又將其調度出來重新執行。
實際上,當某個線程調用了yield方法暫停之後,只有優先順序與當前線程相同,或者優先順序比當前線程更高的處於就緒狀態的線程才會獲得執行的機會。
package com.hehe.thread;public class Yield extends Thread{public Yield(String name){super(name);}//定義run方法作為線程執行體public void run(){for (int i = 0; i <50; i++) {System.out.println(getName() + " " + i);if (i==20) {Thread.yield();}}}public static void main(String[] args)throws Exception{//啟動兩個並發線程Yield yieldThread1=new Yield("進階");yieldThread1.setPriority(Thread.MAX_PRIORITY);yieldThread1.start();Yield yieldThread2=new Yield("低級");yieldThread2.setPriority(Thread.MIN_PRIORITY);yieldThread2.start();} }
sleep和yield的區別:
1.sleep方法暫停當前線程,會給其他線程執行機會,不會理會其他線程的優先順序;但yield方法只會給優先順序相同,或優先順序更高的 線程執行機會。
2.sleep方法會將線程轉入阻塞狀態,知道經過阻塞時間才會轉入就緒狀態,而yield不會將線程轉入阻塞狀態,它只是強制當前線程進入就緒狀態。因此完全有可能某個線程調用yield方法暫停之後,立即再次獲得處理器資源被執行。
3.sleep方法比yield方法有更好的可移植性,通常不建議使用yield方法來控制並發線程的執行。