09 sleep和wait区别
sleep和wait区别
sleep是Thread的方法,wait是Object的方法 sleep不会释放锁,但是wait会释放锁,并且将线程添加到该对象监视器(monitor)的等待队列中 sleep使用的时候不依赖同步锁,而使用wait的时候必须加同步锁 sleep不需要被唤醒,但是wait是需要唤醒的
演示
public class DifferenceOfWaitAndSleep {
private final static Object LOCK = new Object ( ) ;
public static void main ( String[ ] args) {
m3 ( ) ;
}
public static void m1 ( ) {
try {
Thread. sleep ( 3000 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
public static void m2 ( ) {
try {
LOCK. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
public static void m3 ( ) {
synchronized ( LOCK) {
try {
LOCK. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
public static void m4 ( ) {
synchronized ( LOCK) {
try {
Thread. sleep ( 3000 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
}
@Slf4j
public class DifferenceOfWaitAndSleep2 {
private final static Object LOCK = new Object ( ) ;
public static void main ( String[ ] args) {
Stream. of ( "T1" , "T2" ) . forEach ( t - > {
new Thread ( t) {
@Override
public void run ( ) {
m2 ( ) ;
}
} . start ( ) ;
} ) ;
}
public static void m1 ( ) {
synchronized ( LOCK) {
try {
log. info ( "{} enter" ) ;
Thread. sleep ( 3000 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
public static void m2 ( ) {
synchronized ( LOCK) {
try {
log. info ( "{} enter" ) ;
LOCK. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
}