Java线程wait和sleep的区别

时间:2023-03-09 17:18:16
Java线程wait和sleep的区别

Java中调用wait方法或者sleep方法都可以让线程进入waitint或者time-waiting状态,但是它们还是

有所不同的:

  1. wait是Object中的方法,而sleep则是Thread中的方法。
  2. sleep可以在任何地方使用,而wait只可以在synchronized方法或synchronized块中使用。
  3. 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();
}
} }

  输出结果:

Java线程wait和sleep的区别

  该段代码的原理是先执行线程A,在进入synchonized之后调用wait方法,这个时候线程B也开始执行了;

而如果wait方法会释放锁的话,则B线程可以进入synchonized块中执行,执行完毕后才释放锁给A线程继续执行。