对于sleep()方法,我们首先要知道该方法是属于Thread类中的。
而wait()方法,则是属于Object类中的。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
获取对象锁进入运行状态。
package com.ange.demo.thread;
public class ThreadTestWaitAndSleep {
//https://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html wait and sleep的区别
static Thread t1, t2 = null;
public static void main(String[] args) {
System.out.print("hello");
t1 = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
synchronized (ThreadTestWaitAndSleep.class) {
while (i < 30) {
i++;
System.out.println("t1:" + i);
if (i == 10) {
//这里join 在线程1中执行,使线程2先执行完再执行线程1
t2.start();
System.out.println("t1:t2开始执行,由于锁被t1持有,t2在阻塞");
}
if (i == 20) {
try {
//调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
System.out.println("t1:进入等待状态");
ThreadTestWaitAndSleep.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
});
t2 = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
synchronized (ThreadTestWaitAndSleep.class) {
while (i < 30) {
i++;
System.out.println("t2www:" + i);
if (i == 20) {
System.out.println("t2www:在t2通知解除阻塞,t1继续执行");
ThreadTestWaitAndSleep.class.notify();
}
}
}
}
});
t1.start();
}
}
本例子中,t1先开始执行,当t1 的i==10时,调用t2 start(),由于t1持有锁对象,t2进入阻塞状态等待锁,t1继续执行,到i==20时,t1中ThreadTestWaitAndSleep.class.wait();使线程会放弃对象锁,进入等待此对象的等待锁定池,t2得到锁,执行完后调用
对象调用notify()方法后t1线程才进入对象锁定池准备,如果不通知,t2执行完后,t1将一直等待。
结果如下:
hellot1:1
t1:2
t1:3
t1:4
t1:5
t1:6
t1:7
t1:8
t1:9
t1:10
t1:t2开始执行,由于锁被t1持有,t2在阻塞
t1:11
t1:12
t1:13
t1:14
t1:15
t1:16
t1:17
t1:18
t1:19
t1:20
t1:进入等待状态
t2www:1
t2www:2
t2www:3
t2www:4
t2www:5
t2www:6
t2www:7
t2www:8
t2www:9
t2www:10
t2www:11
t2www:12
t2www:13
t2www:14
t2www:15
t2www:16
t2www:17
t2www:18
t2www:19
t2www:20
t2www:在t2通知解除阻塞,t1继续执行
t2www:21
t2www:22
t2www:23
t2www:24
t2www:25
t2www:26
t2www:27
t2www:28
t2www:29
t2www:30
t1:21
t1:22
t1:23
t1:24
t1:25
t1:26
t1:27
t1:28
t1:29
t1:30