多執行緒--sleep、yield對比
demo:
public class TestSleep { public static void main(String[] args) { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("當前時間:"+new Date()+" "+Thread.currentThread().getName()+" "+i); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
2.yield執行緒讓步,是一個Thread類提供的靜態方法,可以讓當前正在執行的執行緒暫停,但他不會阻塞該執行緒,它只是讓該執行緒轉入就緒狀態,當系統的執行緒排程器重新排程時,還可以被排程出來重新執行。此外,當某個執行緒呼叫yield方法暫停時,只有優先順序與當前執行緒相同,或者優先順序更高的執行緒才能獲得執行的機會。 執行緒在排程的過程中需要考慮優先順序,其次是誰得到資源誰執行。 demo:
public class YieldTest extends Thread { public YieldTest(){ } public YieldTest(String name){ super(name); } public void run(){ for(int i=0;i<50;i++){ System.out.println(getName()+" "+i); //System.out.println(Thread.currentThread().getName()+" "+i); if(i == 20){ Thread.yield(); } } } public static void main(String[] args) { // TODO Auto-generated method stub YieldTest ty1= new YieldTest("高階"); ty1.setPriority(Thread.MAX_PRIORITY); ty1.start(); YieldTest ty2 =new YieldTest("低階"); ty2.setPriority(MIN_PRIORITY); ty2.start(); /*for(int i=0;i<10;i++){ YieldTest ty2 =new YieldTest("低階"); ty2.setPriority(MIN_PRIORITY); ty2.start(); System.out.println(Thread.currentThread().getName()+" "+i); }*/ } }
解析:大家可以按照提供的demo 執行以下,建議多執行幾遍,有時候可能每次執行的結果都不一樣。其次建議大家把註釋的程式碼也執行以下,有利於大家理解執行緒排程,主執行緒和子執行緒。需要注意的是main主執行緒,這個需要大家好好理解以下。
總結:
多執行緒我們開始理解的時候可能很簡單,動手做的時候可能感覺很模糊,不清楚執行緒是個怎樣的概念,這個時候需要多執行兩遍你的程式碼,然後修改你的程式碼,繼續執行,你會返現一些不一樣的東西。總之執行緒是個很有意思的東西,大家可以深入研究一下!我在這兒算是拋磚引玉吧!