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线程继续执行。

猜你喜欢

转载自www.cnblogs.com/alinainai/p/10409606.html