1. 程式人生 > 實用技巧 >sleep和wait的區別

sleep和wait的區別

sleep和wait的區別:
1、sleep是Thread的靜態方法,wait是Object的方法,任何物件例項都能呼叫。
2、sleep不會釋放鎖,它也不需要佔用鎖。wait會釋放鎖,但呼叫它的前提是當前執行緒佔有鎖(即程式碼要在synchronized中)。
3、它們都可以被interrupted方法中斷。

sleep()方法導致了程式暫停執行指定的時間,讓出cpu該其他執行緒,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復執行狀態。

sleep,wait呼叫後都會暫停當前執行緒並讓出cpu的執行時間,但不同的是sleep不會釋放當前持有的物件的鎖資源,到時間後會繼續執行,而wait會放棄所有鎖並需要notify/notifyAll後重新獲取到物件鎖資源後才能繼續執行

wait sleep
同步 只能在同步上下文中呼叫wait方法,否則或丟擲異常 不需要在同步方法或同步塊中呼叫
作用物件 wait方法定義在Object類中,作用於物件本身 Sleep方法這定義在java.lang.Thrand中作用於當前線存
釋放鎖資源
喚醒條件 其他執行緒呼叫物件notify()或notifyAll()方法 超時,或者呼叫interrupt()方法
方法屬性 wait是實列方法 sleep是靜太方法

Sleep列如:

@Override public void run() { while (tickets > 0) { tickets--; // 如果還有票就賣一張 long startTime=0; long endTime=0; startTime = System.currentTimeMillis(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("剩餘票數為:" + tickets); endTime = System.currentTimeMillis(); System.out.println("程式執行時間:" + (endTime - startTime) + "ms"); } }

測試:

public class MyThreadTest {
    public static void main(String[] args)
    {
//        MyRunnable thread = new MyRunnable();
//        new Thread(thread).start();//同一個mt,但是在Thread中就不可以,如果用同一
//        new Thread(thread).start();//個例項化物件mt,就會出現異常
//        new Thread(thread).start();

        MyThread mts = new MyThread();
        new Thread(mts).start();  //啟動 n 個執行緒
        MyThread mts2 = new MyThread();
        new Thread(mts2).start();
        MyThread mts3 = new MyThread();
        new Thread(mts3).start();
    }




}
結果:

剩餘票數為:2
程式執行時間:1007ms
剩餘票數為:2
程式執行時間:1007ms
剩餘票數為:2
程式執行時間:1007ms

。。。。

wait列如

public class MyThread  extends Thread {
    private int tickets = 3;
    final  Object lock = new Object();
    @Override
    public void run()
    {
        while (tickets > 0) {
            synchronized (lock) {
                tickets--; // 如果還有票就賣一張
                long startTime = 0;
                long endTime = 0;
                startTime = System.currentTimeMillis();
                try {
                    lock.wait(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("剩餘票數為:" + tickets);
                endTime = System.currentTimeMillis();
                System.out.println("程式執行時間:" + (endTime - startTime) + "ms");
            }
        }


    }
}

測試:

public static void main(String[] args)
{

    MyThread mts = new MyThread();
    new Thread(mts).start();  //啟動 n 個執行緒
    MyThread mts2 = new MyThread();
    new Thread(mts2).start();
    MyThread mts3 = new MyThread();
    new Thread(mts3).start();
}

結果:

剩餘票數為:2
程式執行時間:1003ms
剩餘票數為:2
程式執行時間:1003ms
剩餘票數為:2
程式執行時間:1004ms
剩餘票數為:1
程式執行時間:1001ms
剩餘票數為:1
程式執行時間:1001ms
剩餘票數為:1
程式執行時間:1000ms
剩餘票數為:0
程式執行時間:1000ms
剩餘票數為:0
剩餘票數為:0
程式執行時間:1001ms
程式執行時間:1001ms