1. 程式人生 > >Java多執行緒(四)java中的Sleep方法

Java多執行緒(四)java中的Sleep方法

點我跳過黑哥的卑鄙廣告行為,進入正文。

Java多執行緒系列更新中~

  正式篇:

  1. Java多執行緒(一) 什麼是執行緒
  2. Java多執行緒(二)關於多執行緒的CPU密集型和IO密集型這件事
  3. Java多執行緒(三)如何建立執行緒
  4. Java多執行緒(四)java中的Sleep方法

  番外篇(神TM番外篇):

  1. Java 過一下基礎
  2. 轉載:java中Thread.sleep()函式使用

Thread類為睡眠執行緒提供了兩種方法:

  1. public static void sleep(long miliseconds)丟擲InterruptedException
  2. 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嗎?這就引出了執行緒的生命週期。