sleep和wait的區別
阿新 • • 發佈:2020-08-06
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