sleep和wait的区别
- sleep()是
Thread类的方法
,而wait是Object类中定义的方法
. - sleep()方法在任何地方都可以使用,而wait方法只能在synchronized(用于加锁)方法或者synchronized块中使用.
- Thread.sleep()只会
让出cpu,不会导致锁行为的改变
(可以理解为不会让资源),即如果当前线程是拥有锁
的,那么该线程对象调用sleep()方法不会释放锁,只会让出CPU给其他任务执行,但是该线程所占有的资源其他线程依旧是无法访问的. - Object.wait()
不仅会让出CPU,还会释放已经占有的同步资源锁
,即其他等待该资源的线程此时也是可以获取该资源来运行的,同时这也说明了为什么wait()方法要放在synchronized方法或者synchronized块中,因为我只能获取到了锁才可以释放锁嘛
哈哈哈.
public class WaitSleepTest {
public static void main(String[] args) {
final Object lock = new Object();
//通过wait执行等待
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("threadA is waiting to get lock...");
synchronized (lock) {
try {
System.out.println("ThreadA get lock.");
Thread.sleep(20);
System.out.println("threadA do wait method");
lock.wait(1000);
System.out.println("threadA is done");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
//由于哪个线程先执行是不一定的,所以我们在这里让主线程休眠一会,等一会再让主线程去启动第二个线程
try {
//由于只等待了10毫秒,所以在线程Asleep的过程中线程B就启动了
//因为sleep不会让资源,所以此时线程B只能处于等待状态
//当线程A进入wait方法后,他会让时间和资源,所以线程B就会一直跑完,然后Await时间结束后自动跑完
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//通过sleep执行等待
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("threadB is waiting to get lock...");
synchronized (lock) {
try {
System.out.println("ThreadB get lock.");
System.out.println("threadB is sleeping 10 ms");
Thread.sleep(10);
System.out.println("threadB is done");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
---运行结果
threadA is waiting to get lock...
ThreadA get lock.
threadB is waiting to get lock...
threadA do wait method
ThreadB get lock.
threadB is sleeping 10 ms
threadB is done
threadA is done