1. 程式人生 > >多執行緒例子:yield

多執行緒例子:yield

Java程式碼  收藏程式碼
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Thread t1 = new MyThread1();  
  4.         Thread t2 = new Thread(new MyRunnable());  
  5.         t2.start();  
  6.         t1.start();  
  7.     }  
  8. }  
  9. class MyThread1 extends Thread {  
  10.     public void run() {  
  11.         for (int i = 0
    ; i < 10; i++) {  
  12.             System.out.println("執行緒1第" + i + "次執行!");  
  13. //          try {  
  14. //              Thread.sleep(1000);  
  15. //          } catch (InterruptedException e) {  
  16. //              // TODO Auto-generated catch block  
  17. //              e.printStackTrace();  
  18. //          }  
  19.         }  
  20.     }  
  21. }  
  22. class
     MyRunnable implements Runnable {  
  23.     public void run() {  
  24.         for (int i = 0; i < 10; i++) {  
  25.             System.out.println("執行緒2第" + i + "次執行!");  
  26.             Thread.yield();  
  27.         }  
  28.     }  
  29. }  

執行結果是: 
Java程式碼  收藏程式碼
  1. 執行緒20次執行!  
  2. 執行緒10次執行!  
  3. 執行緒21次執行!  
  4. 執行緒11次執行!  
  5. 執行緒22次執行!  
  6. 執行緒1
    2次執行!  
  7. 執行緒23次執行!  
  8. 執行緒13次執行!  
  9. 執行緒24次執行!  
  10. 執行緒14次執行!  
  11. 執行緒25次執行!  
  12. 執行緒15次執行!  
  13. 執行緒26次執行!  
  14. 執行緒27次執行!  
  15. 執行緒28次執行!  
  16. 執行緒16次執行!  
  17. 執行緒29次執行!  
  18. 執行緒17次執行!  
  19. 執行緒18次執行!  
  20. 執行緒19次執行!  

yield本意是讓步,但是看這個結果,似乎並沒有起到什麼效果。起碼是看不出來有什麼用處。 

事實上,Thread中yield()是讓當前執行緒暫停,交出CPU,轉入可執行狀態,讓系統的執行緒排程器重新排程一次。再次排程時,哪個執行緒都有可能被排程。 
yield() 使得執行緒放棄當前分得的 CPU 時間,但是不使執行緒阻塞,即執行緒仍處於可執行狀態,隨時可能再次分得 CPU 時間。