Java線程wait和sleep的區別


Java中調用wait方法或者sleep方法都可以讓線程進入waitint或者time-waiting狀態,但是它們還是

有所不同的:

  1. wait是Object中的方法,而sleep則是Thread中的方法。
  2. sleep可以在任何地方使用,而wait只可以在synchronized方法或synchronized塊中使用。
  3. sleep方法只會讓出當前線程持有的時間片,而wait方法除了讓出時間片還會讓出當前線程持有的鎖。

  如何證明呢?我設計了如下代碼來證明:

 1 package com.basic.thread;
 2 
 3 /**
 4  * @author zhangxingrui
 5  * @create 2019-02-20 21:37
 6  **/
 7 public class WaitAndSleepDemo {
 8 
 9     public static void main(String[] args) {
10         final Object object = new Object();
11 
12         try {
13             new Thread(new Runnable() {
14                 @Override
15                 public void run() {
16                     System.out.println("線程A開始");
17                     synchronized (object){
18                         try {
19                             System.out.println("線程A獲取到鎖");
20                             object.wait(1000);
21                             System.out.println("線程A結束");
22                         } catch (InterruptedException e) {
23                             e.printStackTrace();
24                         }
25                     }
26                 }
27             }).start();
28 
29             Thread.sleep(100);
30 
31             new Thread(new Runnable() {
32                 @Override
33                 public void run() {
34                     System.out.println("線程B開始");
35                     synchronized (object){
36                         try {
37                             System.out.println("線程B獲取到鎖");
38                             Thread.sleep(1000);
39                             System.out.println("線程B結束");
40                         } catch (InterruptedException e) {
41                             e.printStackTrace();
42                         }
43                     }
44                 }
45             }).start();
46         }catch (InterruptedException e){
47             e.printStackTrace();
48         }
49     }
50 
51 }

  輸出結果:

  該段代碼的原理是先執行線程A,在進入synchonized之后調用wait方法,這個時候線程B也開始執行了;

而如果wait方法會釋放鎖的話,則B線程可以進入synchonized塊中執行,執行完畢后才釋放鎖給A線程繼續執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM