- sleep方法是Thread类的静态方法,wait()是Object超类的成员方法
-
sleep 它不会释放锁 ,wait会释放锁 (sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。but 当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备)
测试2
package com.example.springmybatisshiro.threadpack9;
import java.util.stream.Stream;
/**
* @program: spring-mybatis-shiro
* @description: DifferenceWaitAndSleep
* @author: zhou.zhang
* @create: 2019-12-25 15:40
**/
public class DifferenceWaitAndSleep {
private final static Object LOCK = new Object();
public static void main(String[] args) {
Stream.of("t1", "t2").forEach(n -> {
new Thread(n) {
@Override
public void run() {
m1();
//m2();
}
}.start();
});
}
public static void m1() {
synchronized (LOCK) {
try {
System.err.println("Thread " + Thread.currentThread().getName());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void m2() {
synchronized (LOCK) {
try {
System.err.println("Thread " + Thread.currentThread().getName());
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
调用m1()
掉用m2
3.使用sleep的时不需要定义 synchronized的方法 而wait需要定义
wait() 方法
private final static Object LOCK = new Object();
public static void main(String[] args) {
m2();
}
public static void m2() {
try {
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
but---------------------------------
public static void m2() {
synchronized (LOCK) {
try {
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
sleep()方法
public static void m1() {
try {
System.err.println("Thread " + Thread.currentThread().getName());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
4.使用sleep不需要被唤醒,时间到了就醒了 而wait需要 但wait(timeout)除外
main(){
m1();
}
public static void m1() {
try {
System.err.println("Thread " + Thread.currentThread().getName());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private final static Object LOCK = new Object();
main(){
m2();
}
public static void m2() {
synchronized (LOCK) {
try {
System.err.println("Thread " + Thread.currentThread().getName());
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
但wait(timeout)
public static void m2() {
synchronized (LOCK) {
try {
System.err.println("Thread " + Thread.currentThread().getName());
LOCK.wait(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
java生命周期图谱如下所示: