sleep与wait的区别,详细解答(通过代码验证)

 package com.ysq.test;

 /**
* sleep与wait的区别:
* @author ysq
*
*/
public class SleepAndWait { public static void main(String[] args) {
//启动线程1
new Thread(new Thread1()).start();
try {
Thread.sleep(4*1000);//休眠10ms
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//启动线程2
new Thread(new Thread2()).start(); }
private static class Thread1 implements Runnable{ @Override
public void run() { synchronized (SleepAndWait.class){//这里没有使用this,因为为了使两个线程使用同一监听器,因为在Thread2里面的this和这个Thread1的this不是同一个对象。
System.out.println("enter thread1...");
System.out.println("thread1 is waiting");
try {
//使用wait方法释放同步锁。
SleepAndWait.class.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread1 is going on...");
System.out.println("thread1 is being over!");
}
}
} private static class Thread2 implements Runnable{ @Override
public void run() {
synchronized (SleepAndWait.class){
System.out.println("enter thread2...");
System.out.println("thread2 notify other thread can release wait status..");
//只有线程2(其他线程)调用了notify方法 调用wait方法的线程(这里是线程1)就会解除wait状态和程序可以再次得到锁后继续向下运行
SleepAndWait.class.notify();
System.out.println("thread2 is sleeping ten millisecond...");
try {
//但由于notify不能释放同步锁
Thread.sleep(4*1000);//因此线程2虽然已进入休眠状态,但线程1仍然不用运行,因为线程2使用的是notify()
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread2 is going on...");
System.out.println("thread2 is being over!"); }
} }
}

总结:通过上面的代码,我们可以登场sleep和wait的区别,如下:

1,sleep是线程类Thread的方法,wait是Object类中的方法

   2,sleep此线程暂停执行指定时间,将执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁

   3,对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态
   4,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
   5,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }

上一篇:CStringArray用法


下一篇:eclipse 一些快捷键