sleep和wait
- A sleep是线程类(Thread)的方法,wait是Object类的方法;
- C sleep暂停线程、但监控状态仍然保持,结束后会自动恢复
- D wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态
关于A
sleep是Thread类中的方法,而wait、notify、notifyAll都是Object类中的方法。
sleep是Thread类中的静态方法。因此无论是在a线程中调用b的sleep方法,还是在b线程中调用a的sleep方法,谁调用谁就sleep。也因此,sleep可以在任何地方使用。
wait、notify、notifyAll就很惨了,只能在同步控制方法或同步控制块中使用。
关于B、C
使当前执行线程休眠(暂时停止执行),以指定毫秒数加上指定的纳秒数,以系统定时器和调度器的精度和准确性为准。线程不会丢失任何监视器(monitor)的所有权。
因为sleep()并没释放锁,所以仍旧处在同步状态,监控仍旧存在,睡眠时间结束后自动恢复运行。
注:对象锁就是常说的同步锁——synchronized。监视器(monitor)或者说其所有权我也理解为对象锁,毕竟锁住以后就又拥有的权利了,以上翻译如若有错,百度的锅。
关于D
这里就需要提及两个概念,Java中每个对象都有两个池:锁池、等待池。
如果线程调用了对象的wait()方法,那么线程就处于该对象的等待池中,等待池中的线程不会去争夺锁的拥有权。
以上线程拿到锁要干嘛?进入就绪状态,等待CPU时间片开始运行。
private static class Thread1 implements Runnable {
// 由于 Thread1和下面Thread2内部run方法要用同一对象作为监视器,如果用this则Thread1和Threa2的this不是同一对象
// 所以用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时指向的都是同一个对象
synchronized (MultiThread.class) {
System.out.println("thread1 创建...");
System.out.println("thread1 就绪中");
// 释放锁有两种方式:(1)程序自然离开监视器的范围,即离开synchronized关键字管辖的代码范围
// (2)在synchronized关键字管辖的代码内部调用监视器对象的wait()方法。这里使用wait方法
} catch (InterruptedException e) {
System.out.println("thread1 正在运行 ...");
System.out.println("thread1 结束!");
private static class Thread2 implements Runnable {
// notify方法并不释放锁,即使thread2调用了下面的sleep方法休息10ms,但thread1仍然不会执行
// 因为thread2没有释放锁,所以Thread1得不到锁而无法执行
synchronized (MultiThread.class) {
System.out.println("thread2 创建...");
System.out.println("thread2 此刻唤醒其他wait线程notify other thread can release wait status ...");
System.out.println("thread2 睡了...");
} catch (InterruptedException e) {
System.out.println("thread2 正在运行...");
System.out.println("thread2 结束!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("第" + i + "次输出");
public static void main(String[] args) {
new Thread(new Thread1()).start();
} catch (InterruptedException e) {
new Thread(new Thread2()).start();
private static class Thread1 implements Runnable {
// 由于 Thread1和下面Thread2内部run方法要用同一对象作为监视器,如果用this则Thread1和Threa2的this不是同一对象
// 所以用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时指向的都是同一个对象
synchronized (MultiThread.class) {
System.out.println("thread1 创建...");
System.out.println("thread1 就绪中");
// 释放锁有两种方式:(1)程序自然离开监视器的范围,即离开synchronized关键字管辖的代码范围
// (2)在synchronized关键字管辖的代码内部调用监视器对象的wait()方法。这里使用wait方法
} catch (InterruptedException e) {
System.out.println("thread1 正在运行 ...");
System.out.println("thread1 结束!");
private static class Thread2 implements Runnable {
// notify方法并不释放锁,即使thread2调用了下面的sleep方法休息10ms,但thread1仍然不会执行
// 因为thread2没有释放锁,所以Thread1得不到锁而无法执行
synchronized (MultiThread.class) {
System.out.println("thread2 创建...");
System.out.println("thread2 此刻唤醒其他wait线程notify other thread can release wait status ...");
System.out.println("thread2 睡了...");
} catch (InterruptedException e) {
System.out.println("thread2 正在运行...");
System.out.println("thread2 结束!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("第" + i + "次输出");
public static void main(String[] args) {
new Thread(new Thread1()).start();
} catch (InterruptedException e) {


浙公网安备 33010602011771号