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()
}