導航:首頁 > 編程語言 > JAVAsleep與wait區別

JAVAsleep與wait區別

發布時間:2022-05-03 00:11:39

java中的sleep和wait的區別

java中的sleep和wait的區別如下:
1、所屬的超類不同:sleep屬於線程Thread類的方法,而wait屬於Object方法
2、用法不同:
①sleep()方法導致了程序暫停執行指定的時間,讓出cpu該其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。
②調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()方法後本線程才進入對象鎖定池准備
3、舉例說明:
wait方法:
private static class Thread1 implements Runnable{
@Override
public void run(){
synchronized (TestD.class) {
System.out.println("enter thread1...");
System.out.println("thread1 is waiting...");
try {
//調用wait()方法,線程會放棄對象鎖,進入等待此對象的等待鎖定池
TestD.class.wait();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread1 is going on ....");
System.out.println("thread1 is over!!!");
}
}
}
sleep方法用法:
private static class Thread2 implements Runnable{
@Override
public void run(){
synchronized (TestD.class) {
System.out.println("enter thread2....");
System.out.println("thread2 is sleep....");
//只有針對此對象調用notify()方法後本線程才進入對象鎖定池准備獲取對象鎖進入運行狀態。
TestD.class.notify();
//==================
//區別
//如果我們把代碼:TestD.class.notify();給注釋掉,即TestD.class調用了wait()方法,但是沒有調用notify()
//方法,則線程永遠處於掛起狀態。
try {
//sleep()方法導致了程序暫停執行指定的時間,讓出cpu該其他線程,
//但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。
//在調用sleep()方法的過程中,線程不會釋放對象鎖。
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread2 is going on....");
System.out.println("thread2 is over!!!");
}
}
}
運行結果:
enter thread1...
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over
thread1 is going on ....
thread1 is over

⑵ java中wait和sleep的區別

1.對於sleep()方法,是屬於Thread類中的。而wait()方法,則是屬於Object類中的。
2.最主要是sleep方法沒有釋放鎖,而 wait 方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用

4.sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
5、sleep()是讓某個線程暫停運行一段時間,其控制范圍是由當前線程決定,也就是說,在線程裡面決定;wait(),首先,這是由某個確定的對象來調用的,將這個對象理解成一個傳話的人,當這個人在某個線程裡面說"暫停!",

⑶ java sleep() 和 wait() 有什麼區別

1、同步鎖的對待不同:

sleep()後,程序並不會不釋放同步鎖。

wait()後,程序會釋放同步鎖。

2、用法的不同:

sleep()可以用時間指定來使他自動醒過來。如果時間不到你只能調用interreput()來強行打斷。

wait()可以用notify()直接喚起。


3、屬於不同的類:

sleep()的類是Thread。

wait()的類是Object。

⑷ sleep和wait的區別

sleep和wait的區別:

1、sleep是Thread的靜態方法,wait是Object的方法,任何對象實例都能調用。

2、sleep不會釋放鎖,它也不需要佔用鎖。wait會釋放鎖,但調用它的前提是當前線程佔有鎖(即代碼要在synchronized中)。

3、它們都可以被interrupted方法中斷。

具體來說:

Thread.Sleep(1000)意思是在未來的1000毫秒內本線程不參與CPU競爭,1000毫秒過去之後,這時候也許另外一個線程正在使用CPU,那麼這時候操作系統是不會重新分配CPU的,直到那個線程掛起或結束。

即使這個時候恰巧輪到操作系統進行CPU分配,那麼當前線程也不一定就是總優先順序最高的那個,CPU還是可能被其他線程搶佔去。另外值得一提的是Thread.Sleep(0)的作用,就是觸發操作系統立刻重新進行一次CPU競爭,競爭的結果也許是當前線程仍然獲得CPU控制權,也許會換成別的線程獲得CPU控制權。

wait(1000)表示將鎖釋放1000毫秒,到時間後如果鎖沒有被其他線程佔用,則再次得到鎖,然後wait方法結束,執行後面的代碼,如果鎖被其他線程佔用,則等待其他線程釋放鎖。

注意,設置了超時時間的wait方法一旦過了超時時間,並不需要其他線程執行notify也能自動解除阻塞,但是如果沒設置超時時間的wait方法必須等待其他線程執行notify。

⑸ java sleep 和wait的區別

java中sleep和wait的區別主要有兩點,第一sleep必須指定時間,而wait可以指定也可以不指定;第二在同步中,sleep釋放cpu執行權,但是不釋放鎖,而wait釋放cpu執行權和鎖。
java中sleep和wait都是讓線程休眠的方法,它們都是阻塞方法。在同步中,需要注意根據具體的需求來選擇使用sleep和wait。

⑹ java wait和sleep的區別

第一種解釋:

功能差不多,都用來進行線程式控制制,他們最大本質的區別是:sleep()不釋放同步鎖,wait()釋放同步縮.

還有用法的上的不同是:sleep(milliseconds)可以用時間指定來使他自動醒過來,如果時間不到你只能調用interreput()來強行打斷;wait()可以用notify()直接喚起.

第二種解釋:

sleep是Thread類的靜態方法。sleep的作用是讓線程休眠制定的時間,在時間到達時恢復,也就是說sleep將在接到時間到達事件事恢復線程執行,例如:

try{
System.out.println("I'm going to bed");
Thread.sleep(1000);
System.out.println("I wake up");
}
catch(IntrruptedException e) {
}

wait是Object的方法,也就是說可以對任意一個對象調用wait方法,調用wait方法將會將調用者的線程掛起,直到其他線程調用同一個對象的notify方法才會重新激活調用者,例如:

//Thread 1

try{
obj.wait();//suspend thread until obj.notify() is called
}
catch(InterrputedException e) {
}

第三種解釋:

這兩者的施加者是有本質區別的.
sleep()是讓某個線程暫停運行一段時間,其控制范圍是由當前線程決定,也就是說,在線程裡面決定.好比如說,我要做的事情是 "點火->燒水->煮麵",而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於運行的主動權是由我的流程來控制.

而wait(),首先,這是由某個確定的對象來調用的,將這個對象理解成一個傳話的人,當這個人在某個線程裡面說"暫停!",也是
thisOBJ.wait(),這里的暫停是阻塞,還是"點火->燒水->煮飯",thisOBJ就好比一個監督我的人站在我旁邊,本來該線
程應該執行1後執行2,再執行3,而在2處被那個對象喊暫停,那麼我就會一直等在這里而不執行3,但這個流程並沒有結束,我一直想去煮飯,但還沒被允許,

直到那個對象在某個地方說"通知暫停的線程啟動!",也就是thisOBJ.notify()的時候,那麼我就可以煮飯了,這個被暫停的線程就會從暫停處

⑺ wait方法和sleep方法的區別

1. Java中sleep和wait的區別

① 這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。

sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程里調用b的sleep方法,實際上還是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep。

② 鎖: 最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。

sleep不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其他線程可以佔用CPU。一般wait不會加時間限制,因為如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用notify/notifyAll喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷。

Thread.sleep(0)的作用是「觸發操作系統立刻重新進行一次CPU競爭」。

③ 使用范圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用。

synchronized(x){
x.notify()
//或者wait()
}

2. Java中HashMap和HashTable的區別

① 歷史原因: Hashtable是給予陳舊的Dictonary類的, HashMap是Java1.2引進的Map介面的一個實現

② HashMap允許空的鍵值對, 而HashTable不允許

③ HashTable同步,而HashMap非同步,效率上比HashTable要高

3. 請簡述在異常當中,throw和throws有什麼區別

① throw代表動作,表示拋出一個異常的動作;throws代表一種狀態,代表方法可能有異常拋出
② throw用在方法實現中,而throws用在方法聲明中
③ throw只能用於拋出一種異常,而throws可以拋出多個異常

⑻ 2020-09-15:java里的wait()和sleep()的區別有哪些

1: 方法所在類不同 wait是object類中的方法 sleep是Thread類中的方法
2: wait方法釋放鎖 sleep不釋放鎖
3: wait方法會使得線程進入線程等待池中 需要使用notify方法喚醒,sleep方法在指定的時間過後則自動蘇醒

⑼ java中sleep和wait的區別

它們最大本質的區別是:sleep()不釋放同步鎖,wait()釋放同步鎖.
還有用法的上的不同是:sleep(milliseconds)可以用時間指定來使他自動醒過來,如果時間不到你只能調用interreput()來強行打斷;wait()可以用notify()直接喚起.

sleep和wait的區別還有:
1。這兩個方法來自不同的類分別是Thread和Object
2。最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
3。wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4。sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

⑽ java 中 sleep 和 wait 的區別

首先:sleep是通過線程來調用的。它是Thread身上的方法。而wait是Object身上的方法。
所以調用的時候需要用object來調用。
其次:原理不同。當前線程在同步代碼塊中,調用sleep之後,當前線程並沒有釋放鎖。意味著
其他線程如果競爭這個鎖。就要等待。
而當前線程在同步代碼塊中調用obj.wait之後。當前線程已經釋放鎖了。意味著其他對象,如果競爭
這個鎖。不需要等待。
說這么多,不如上代碼。場景:兩個線程同時競爭一個資源。使用同步代碼塊。
①競爭同一個obj對象,使用sleep。
publicclassTestSleep{
publicstaticvoidmain(String[]args)throwsException{
finalObjectobj=newObject();
finalThreadt1=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("1");
}
}
};
finalThreadt2=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
System.out.println("2");
}
}
};
t1.start();
Thread.sleep(100);//確保t1先執行。先搶到obj的控制權。
t2.start();
}
}
分析:創建一個obj。兩條線程。Thread.sleep(100);確保讓t1先執行到run方法。所以t1會
先搶到obj的資源,給它上鎖。需要睡000ms,並不釋放obj鎖。此時t2已經跑起來,走到run方法同步代碼塊。
發現obj已經被t1搶到了。所以t2隻能等t1釋放obj鎖。而t1什麼時候釋放obj鎖?t1的同步代碼
塊執行完釋放。什麼時候執行完?列印1的時候執行完。t1釋放鎖之後。t2得到鎖。因為這里只有兩條
線程競爭obj鎖。所以接下來就列印2。
最終結果是先列印1再列印2。

再看另個一例子:
②競爭同一個obj對象,使用wait。
publicclassTestWaint{
publicstaticvoidmain(String[]args)throwsException{
finalObjectobj=newObject();
finalThreadt1=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
try{
obj.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("1");
}
}
};
finalThreadt2=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
System.out.println("2");
obj.notify();
}
}
};
t1.start();
Thread.sleep(100);//確保t1先執行。
t2.start();
}
}

分析:創建一個obj。兩條線程。Thread.sleep(100);確保讓t1先執行到run方法。所以t1會
先搶到obj的資源,給它上鎖。然而接下來t1中調用了obj.wait();這個代碼,表示t1放棄對obj
的擁有權。也就是釋放鎖。(釋放了之後它需要等待。而不是往下執行,等待什麼?等待別人喚醒。
因為wait和notify方法相對。必須要有一個線程調用obj.nofity();時,t1才有可能再次蘇醒。否則永遠等待。)
t1釋放鎖,進入等待。意味著t2不用等到t1的同步代碼塊結束,就可以獲取到obj的控制權。
所以t2就給obj上鎖了。所以t2先列印2。然後調用了obj.nofity();此時t2已經結束。
由於沒有其他線程和t1競爭。此時t1蘇醒,再次獲獲得obj的控制權。往下走,t1線程結束。
所以:先列印2再列印1
講了挺多。我也覺得啰嗦。但是應該通俗易懂吧。

閱讀全文

與JAVAsleep與wait區別相關的資料

熱點內容
grub2命令行 瀏覽:618
無法獲取加密卡信息 瀏覽:774
雲伺服器網卡充值 瀏覽:509
編程就是軟體 瀏覽:49
伺服器如何添加許可權 瀏覽:437
引用指針編程 瀏覽:851
手機加密日記本蘋果版下載 瀏覽:63
命令行括弧 瀏覽:176
java程序升級 瀏覽:490
排序演算法之插入類 瀏覽:227
gcccreate命令 瀏覽:73
海爾監控用什麼app 瀏覽:64
系統盤被壓縮開不了機 瀏覽:984
linuxredis30 瀏覽:541
狸窩pdf轉換器 瀏覽:696
ajax調用java後台 瀏覽:905
活塞式壓縮機常見故障 瀏覽:614
break演算法 瀏覽:731
換電池的app是什麼 瀏覽:771
單片機ad采樣快速發送電腦 瀏覽:22