Java多線程中wait和sleep的區別
如果你瞭解過Java的多線程,一定知道如果讓線程暫停可以通過wait或者sleep來完成,但是二者的區別又是什麼呢。其實他們的主要區別是wait在暫停的時候會釋放鎖,而sleep不會釋放鎖,下面以代碼給大家演示一下二者的不同之處。
public class Wait_and_Sleep{
public static void main(String[] args) {
Object lock = new Object();
new Thread(new Runnable(){
@Override
public void run(){
synchronized(lock){
System.out.println("thread1 get lock");
try{
Thread.sleep(2000);
}catch(Exception e){}
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run(){
synchronized(lock){
System.out.println("thread2 get lock");
}
}
}).start();
}
}
上面的代碼是利用sleep進行暫停的,終端的輸出如下,在thread1得到鎖後2秒才輸出thread2,說明線程1在sleep的時候並沒有釋放鎖。
thread1 get lock
thread2 get lock
我們將代碼稍微改動一下,將sleep修改爲wait:
public class Wait_and_Sleep{
public static void main(String[] args) {
Object lock = new Object();
new Thread(new Runnable(){
@Override
public void run(){
synchronized(lock){
System.out.println("thread1 get lock");
try{
lock.wait();
}catch(Exception e){}
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run(){
synchronized(lock){
System.out.println("thread2 get lock");
// lock.notifyAll();
}
}
}).start();
}
}
上面的代碼是利用wait進行暫停的,終端的輸出如下,和上面不同的是,當thread1進入wait以後,thread2立刻就執行了,說明thread1將鎖釋放掉了。
thread1 get lock
thread2 get lock
另外需要注意的是,如果線程2中lock.notifyAll()是註釋的話,那麼線程1會陷入阻塞,因爲沒有被喚醒,只有加入了notifyAll(),纔會被喚醒,然後重新拿鎖。