暫停Thread
yield方法:
靜態方法Thread.yield() yield方法會讓Thread對象直接從執行(running)狀態進入等待執行(runnable)狀態。 這裡的“直接”是指沒有設定等待時間(沒有blocked pool等待池的概念),也就是yield方法沒有參數。 但是。 因為(running)狀態和(runnable)狀態之間的轉換,需要cpu調度的:可能延遲一點時間,也可能一點也不延遲。 所以我對yield的總結是: 當一個Thread對象,調用Thread.yield()方法, 其實是通知cpu開始調度:running--->runnable
至於cpu何時開始調度,不得而知:可能延遲一點時間調度,也可能一點也不延遲調度。 當cpu調度成功,當前Thread對象進入runnable狀態。 此時,可能由於沒有其他的Thread對象搶佔cpu,當前Thread對象會又被cpu調度,到running狀態。
線程狀態圖沒有更新。其實就是unning<--->runnable這個狀態之間直接轉換。
來看看一段代碼吧。
Hello1
package thread;public class Hello1 extends Thread {String name;public Hello1(String n) {this.name = n;}@Overridepublic void run() { // 迴圈變成1000次for (int i = 1; i <= 1000; i++) {System.out.println(name + " Hello " + i);}}}
Hello2
package thread;public class Hello2 implements Runnable {String name;public Hello2(String n) {this.name = n;}@Overridepublic void run() { // 迴圈變成1000次for (int i = 1; i <= 1000; i++) {System.out.println(name + " Hello " + i); // 這裡開始調用yieldThread.yield();}}}
線程執行類 ThreadsExample1
package thread;public class ThreadsExample1 {public static void main(String[] abc) throws InterruptedException {// thread taskHello1 h1 = new Hello1("Hello1:");Hello2 h2 = new Hello2("hello2:");// thread new , runnableThread t1 = new Thread(h1, "thread1, hello1");Thread t2 = new Thread(h2, "thread2, hello2");t2.start(); // 注意這裡,先開始t2線程t1.start();}}
Hello1和Hello2的迴圈次數變長到1000 t2線程先啟動。 我們來看看列印結果
............................ hello2: Hello 372
hello2: Hello 373
hello2: Hello 374
hello2: Hello 375
Hello1: Hello 1
Hello1: Hello 2
Hello1: Hello 3
Hello1: Hello 4
............................ Hello1: Hello 997
Hello1: Hello 998
Hello1: Hello 999
Hello1: Hello 1000
hello2: Hello 376
hello2: Hello 377
hello2: Hello 378
hello2: Hello 379
hello2: Hello 380
hello2: Hello 381
就如上列印結果來看。 t2 調用Thread.yield();之後,通知了cpu開始調度。 但是cpu調度響應需要一點時間,就這一點時間內,t2還在運行, 列印到hello2: Hello 375的時候,t2進入runnable狀態, t1進入running狀態。 t1列印到Hello1: Hello 1000的時候,t1進入死亡狀態。 cpu調度t2繼續執行,直至t2進入死亡狀態。