Java中调用wait方法或者sleep方法都可以让线程进入waitint或者time-waiting状态,但是它们还是
有所不同的:
- wait是Object中的方法,而sleep则是Thread中的方法。
- sleep可以在任何地方使用,而wait只可以在synchronized方法或synchronized块中使用。
- sleep方法只会让出当前线程持有的时间片,而wait方法除了让出时间片还会让出当前线程持有的锁。
如何证明呢?我设计了如下代码来证明:
package com.basic.thread; /**
* @author zhangxingrui
* @create 2019-02-20 21:37
**/
public class WaitAndSleepDemo { public static void main(String[] args) {
final Object object = new Object(); try {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程A开始");
synchronized (object){
try {
System.out.println("线程A获取到锁");
object.wait(1000);
System.out.println("线程A结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); Thread.sleep(100); new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程B开始");
synchronized (object){
try {
System.out.println("线程B获取到锁");
Thread.sleep(1000);
System.out.println("线程B结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}catch (InterruptedException e){
e.printStackTrace();
}
} }
输出结果:
该段代码的原理是先执行线程A,在进入synchonized之后调用wait方法,这个时候线程B也开始执行了;
而如果wait方法会释放锁的话,则B线程可以进入synchonized块中执行,执行完毕后才释放锁给A线程继续执行。