點我跳過黑哥的卑鄙廣告行爲,進入正文。html
Java多線程系列更新中~java
正式篇:多線程
番外篇(神TM番外篇):函數
參數聲明:線程
public class Multi extends Thread{ public void run() { for(int i=1; i<1000; i++) { //try { // Thread.sleep(500); //}catch (InterruptedException e) { // e.printStackTrace(); //} System.out.println(i); } } public static void main(String[] args) { Multi t1 = new Multi(); Multi t2 = new Multi(); t1.start(); t2.start(); } }
輸出狀況(每臺計算機不同,每次運行也會不同,我截取部分數據分析)code
t1: 一、二、三、四、五、六、七、八、九、10htm
t2: 一、二、三、四、五、六、七、8blog
t1: 十一、十二、1三、1四、1五、1六、1七、1八、1九、20、2一、2二、2三、2四、2五、2六、2七、2八、2九、30生命週期
……
能夠看出,這兩個線程的確是交替執行的。JAVA採用搶佔式線程調度,也就是每一個線程由系統來分配時間,線程的切換並不禁線程自己決定。
public class Multi extends Thread{ public void run() { for(int i=1; i<1000; i++) { try { Thread.sleep(500); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i); } } public static void main(String[] args) { Multi t1 = new Multi(); Multi t2 = new Multi(); t1.start(); t2.start(); } }
這個輸出就是嚴格的一個一次的交替原則。
t1: 1
t2: 1
t1: 2
t2: 2
t1: 3
……
這是由於Sleep()使得當前線程進入阻塞狀態,系統便調用了另外一線程,循環往復,便出現了上面的輸出結果。那麼,什麼狀況阻塞,只有Sleep嗎?這就引出了線程的生命週期。