點我跳過黑哥的卑鄙廣告行為,進入正文。
Java多線程系列更新中~
正式篇:
- Java多線程(一) 什么是線程
- Java多線程(二)關於多線程的CPU密集型和IO密集型這件事
- Java多線程(三)如何創建線程
- Java多線程(四)java中的Sleep方法
- Java多線程(五)線程的生命周期
番外篇(神TM番外篇):
- public static void sleep(long miliseconds)拋出InterruptedException
- public static void sleep(long miliseconds,int nanos)拋出InterruptedException
參數聲明:
- miliseconds-以毫秒為單位的睡眠時間。
- nanos-這是0-999999額外納秒的睡眠時間。
用法示例
1.不睡眠的情況
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、2、3、4、5、6、7、8、9、10
t2: 1、2、3、4、5、6、7、8
t1: 11、12、13、14、15、16、17、18、19、20、21、22、23、24、25、26、27、28、29、30
……
可以看出,這兩個線程的確是交替執行的。JAVA采用搶占式線程調度,也就是每個線程由系統來分配時間,線程的切換並不由線程本身決定。
2. 線程睡眠的情況
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嗎?這就引出了線程的生命周期。