结论
- sleep()是在Thread类上的方法, 而wait()等时在Object类上,所有类都可以使用。
- wait()会使得当前线程进入等待,并且将目标对象的锁交出去。而sleep()不会交出对象锁,而是紧紧抱着睡死。
代码验证 结论
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (Object.class) {
System.out.println(System.currentTimeMillis()+":" + Thread.currentThread().getName() + "我先等待");
try {
Object.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis()+":" + Thread.currentThread().getName() +"爷不等了哈哈");
}
}
},"t1");
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (Object.class) {
System.out.println(System.currentTimeMillis()+":" + Thread.currentThread().getName() +"我叫她别等了啊");
Object.class.notify();
System.out.println(System.currentTimeMillis()+":" + Thread.currentThread().getName() +"我要睡了");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("虽然这里早就唤醒了对方,但是"+Thread.currentThread().getName()+"并没有交出对象的锁,这就导致了在同步代码块中无法让2个线程同时进入");
System.out.println(System.currentTimeMillis()+":" + Thread.currentThread().getName() +"爷睡醒了");
}
}
},"t2");
thread.start();
thread2.start();
}
查看输出结果可知,虽然这里T2拿到锁之后马上就进行了唤醒等待的t1,但是此时的t1也只是进入了就绪状态,并没有真的拿到了锁执行同步代码块中的代码,并且在sleep中t2也是紧紧的将锁抓在手中并且入睡。
如有错误欢迎指正