前言
對于sleep()
方法,我們首先要知道該方法是屬于Thread類中的。而wait()
方法,則是屬于Object類中的。
sleep()
方法導致了程序暫停執行指定的時間,讓出cpu該其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。
在調用sleep()
方法的過程中,線程不會釋放對象鎖。
而當調用wait()
方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()
方法后本線程才進入對象鎖定池準備
獲取對象鎖進入運行狀態。
什么意思呢?
舉個列子說明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
/** * */ package com.b510.test; /** * java中的sleep()和wait()的區別 * @author Hongten * @date 2013-12-10 */ public class TestD { public static void main(String[] args) { new Thread( new Thread1()).start(); try { Thread.sleep( 5000 ); } catch (Exception e) { e.printStackTrace(); } new Thread( new Thread2()).start(); } 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!!!" ); } } } 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!!!" ); } } } } |
運行效果:
1
2
3
4
5
6
7
8
|
enter thread1... thread1 is waiting... enter thread2.... thread2 is sleep.... thread2 is going on.... thread2 is over!!! thread1 is going on .... thread1 is over!!! |
如果注釋掉代碼:
1
|
TestD. class .notify(); |
運行效果:
1
2
3
4
5
6
|
enter thread1... thread1 is waiting... enter thread2.... thread2 is sleep.... thread2 is going on.... thread2 is over!!! |
且程序一直處于掛起狀態。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html