2.sleep和wait的区别:
- sleep是Thread类的方法,wait是object(Java类库的老祖宗)的方法
- sleep阻塞的线程在指定时间后,会转变为可执行状态;wait它要等待notify的唤醒
- 执行了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秒之后得到这个锁对象,等到被唤醒,然后才可以继续执行这个同步代码块。