1. sleep()简介
sleep()是Thread类中的重要方法之一,其作用是使当前线程进入“休眠状态”即从“运行态”变为“阻塞态”。sleep()方法可以指定休眠的时间,线程的实际休眠时间会大于等于该休眠时间;在线程休眠结束时,会重新变为“就绪态”等待CPU的调度。
2. sleep()示例
下面通过一个简单例子来演示sleep()的用法:
public class SleepTest {
public static void main(String[] args){
Thread thread = new Thread(new MyThread());
thread.start();
for (int i = 0; i < 10; i++){
if (i == 8){
System.out.println("主线程玩累了,休眠5S");
try {
thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("主线程愉快的玩耍" + i);
}
}
}
class MyThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++){
if (i == 5){
System.out.println("子线程玩累了,休眠5S");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("子线程愉快的玩耍" + i);
}
}
}
运行结果:
注意:main方法中的thread.sleep()并不是使我们的子线程进入休眠,而是使我们的主线程进入休眠,因为sleep()方法是使当前线程进入休眠,当前运行这句代码的是主线程,所以是主线程进入了休眠。
3.sleep()和wait()方法的区别
-
sleep()是Thread类的方法,必须传入参数,不能实现无限休眠。而wait()是object类的方法,可以传入参数也可以不传入参数,当不传入参数时,必须使用notify()或notifyAll()方法来唤醒。
-
前面我们讲过,使用wait()方法是需要获得锁的,因此wait()方法只能在同步代码块中使用。而sleep方法可以在任何地方使用。但是注意sleep是静态方法,也就是说它只对当前对象有效。通过对象名.sleep()想让该对象线程进入休眠是无效的,它只会让当前线程进入休眠。
-
sleep()方法的使用是需要使用try/catch来捕获异常的,而wait()方法不需要捕获异常,但会抛出InterruptedException异常,该异常是在线程阻塞时其他对象调用它的interrupt()产生的。
-
wait()方法会释放同步锁,而sleep()方法不会释放同步锁,下面通过一个例子来说明这一点:
public class SleepTest {
static Object object = new Object();
public static void main(String[] args) throws InterruptedException {
MyThread threadA = new MyThread("小A");
MyThread threadB = new MyThread("小B");
threadA.start();
threadB.start();
}
static class MyThread extends Thread{
public MyThread(String name){
super(name);
}
@Override
public void run() {
synchronized (object) {
for (int i = 0; i < 5; i++) {
System.out.println(this.getName() + "愉快的玩耍" + i);
if (i == 2){
try {
System.out.println("玩累了,休眠1s");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
}
运行结果:
从运行结果可以看出,小A线程在休眠的过程中并没有让出锁,而是继续持有锁。