java多線程系列基礎篇07-----線程休眠

1 sleep()介紹

sleep()定義在Thread.java中

sleep()的作用是讓當前線程休眠,即當前線程會從"運行狀態"進入到"休眠(阻塞)狀態。sleep()會指定休眠時間,線程休眠的時間會大於/等於該休眠時間;在線程重新被喚醒時,它會由阻塞狀態變成就緒狀態,從而等於cpu的調度執行

2 sleep()示例

package com.tuhu.filt.javadatasleep;

public class SleepTest {
    public static void main(String[] args) {
        ThreadC t1 = new ThreadC("t1");
        t1.start();
    }
}

class ThreadC extends Thread{
    public ThreadC (String name){
        super(name);
    }

    public synchronized void run(){
        try{
            for (int i = 0;i < 10;i++) {
                System.out.printf("%s: %d\n", this.getName(), i);
                if( i%4 ==0){
                    Thread.sleep(100);
                }
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

程序比較簡單在主線程main中啓動線程t1.t1啓動之後,當t1中的計算能被4整除時,t1會通過Thread.sleep(100)休眠100毫秒

3 sleep()與 wait()

wait  讓當前線程由運行狀態進入到等待阻塞狀態 會釋放同步鎖

sleep 讓當前線程由運行狀態進入休眠阻塞狀態 不會釋放同步鎖

下面通過示例演示sleep()是不會釋放的

package com.tuhu.filt.javadatasleep;
// SleepLockTest.java的源碼
public class SleepLockTest{

    private static Object obj = new Object();

    public static void main(String[] args){
        ThreadA t1 = new ThreadA("t1");
        ThreadA t2 = new ThreadA("t2");
        t1.start();
        t2.start();
    }

    static class ThreadA extends Thread{
        public ThreadA(String name){
            super(name);
        }
        public void run(){
            // 獲取obj對象的同步鎖
            synchronized (obj) {
                try {
                    for(int i=0; i <10; i++){
                        System.out.printf("%s: %d\n", this.getName(), i);
                        // i能被4整除時,休眠100毫秒
                        if (i%4 == 0)
                            Thread.sleep(100);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

這和上一篇一個東西差不多,主線程main中啓動了兩個線程t1 和 t2 ,他們會引用同一個對象的同步鎖,即synchronized(obj),在t1運行過程中,雖然他會調用Thread.sleep(100);但是t2是不會獲取cpu執行權的。因爲t1沒有釋放同步鎖 註釋掉synchronized(obj)後再次執行該程序t1和t2是可以相互切換的。比如用this

package com.tuhu.filt.javadatasleep;
// SleepLockTest.java的源碼
public class SleepLockTest{

//    private static Object obj = new Object();

    public static void main(String[] args){
        ThreadA t1 = new ThreadA("t1");
        ThreadA t2 = new ThreadA("t2");
        t1.start();
        t2.start();
    }

    static class ThreadA extends Thread{
        public ThreadA(String name){
            super(name);
        }
        public void run(){
            // 獲取obj對象的同步鎖
            synchronized (this) {
                try {
                    for(int i=0; i <10; i++){
                        System.out.printf("%s: %d\n", this.getName(), i);
                        // i能被4整除時,休眠100毫秒
                        if (i%4 == 0)
                            Thread.sleep(100);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

發佈了84 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章