2.sleep和wait的区别:

  1. sleepThread类的方法,waitobjectJava类库的老祖宗)的方法
  2. sleep阻塞的线程在指定时间后,会转变为可执行状态;wait它要等待notify的唤醒
  3. 执行了sleep的线程不会释放它所持有的锁,wait会释放它持有的锁。

第三点比较重要,

那代码来理解一下:

 1 @Override
 2     public void run() {
 3         synchronized (obj) {
 4             while (true) {
 5                 System.out.println(name);
 6                 try {
 7                     obj.wait();
 8                     //Thread.sleep(2000);
 9                     System.out.println("当前线程,会阻塞在这里");
10                 } catch (InterruptedException e) {
11                     e.printStackTrace();
12                 }
13                 
14                 obj.notify();
15             }
16         }
17     }    

假如说有两个线程分别是a、b, 并且都是执行这个run方法,分两种情况分析:

如果这个程序用第7行,没有第8行,当a线程执行到第7行时,其它线程可能马上可以得到被释放的锁对象,并被唤醒,然后就继续执行这个同步代码块。

如果这个程序用第8行,没有第7行,当a线程执行到第8行时,其它线程要等2秒之后得到这个锁对象,等到被唤醒,然后才可以继续执行这个同步代码块。

原文地址:https://www.cnblogs.com/WNof11020520/p/8781124.html