sleep是Thread持有的方法,而wait是Object类持有的对象;
sleep在持有锁的过程中不会释放锁,而wait在持有锁的过程中会释放锁;
实验代码:
分别注释掉红框中的俩行代码,运行看实验结果,如果注释掉Thread.sleep(2000),最终的运行结果为110,如果注释掉this.wait(2000),最终的运行结果为2100;下面来分析下这段代码的运行原理,main()方法中实例化ThreadTest并启动该线程,然后调用该线程的一个方法(secondMethod()),
因为在主线程中调用方法,所以调用的普通方法secondMethod())会先被执行(但并不是普通方法执行完毕该对象的线程方法才执行,
普通方法执行过程中,该线程的方法也会被执行,他们是交替执行的,只是在主线程的普通方法会先被执行而已),
所以程序运行时会先执行secondMethod(),而secondMethod()方法代码片段中有synchronized block,
因此secondMethod方法被执行后,该方法会占有该对象机锁导致该对象的线程方法一直处于阻塞状态,不能执行,直到secondeMethod释放锁;
使用Thread.sleep(2000)方法时,因为sleep在阻塞线程的同时,并持有该对象锁,所以该对象的其他同步线程(secondMethod())
无法执行,直到synchronized block执行完毕(sleep休眠完毕),secondMethod()方法才可以执行,因此输出结果为number*200+100;
使用this.wait(2000)方法时,secondMethod()方法被执行后也锁定了该对象的机锁,执行到this.wait(2000)时,
该方法会休眠2S并释当前持有的锁,此时该线程的同步方法会被执行(因为secondMethod持有的锁,已经被wait()所释放),因此输出的结果为:number+100
网友评论