java多线程系列 —— (4)sleep()方法

本文详细介绍了Java中的sleep()方法,包括其作用、示例及与wait()方法的区别。sleep()用于使当前线程进入休眠状态,而wait()则需要在同步代码块中使用并涉及锁的释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()方法的区别

  1. sleep()是Thread类的方法,必须传入参数,不能实现无限休眠。而wait()是object类的方法,可以传入参数也可以不传入参数,当不传入参数时,必须使用notify()或notifyAll()方法来唤醒。

  2. 前面我们讲过,使用wait()方法是需要获得锁的,因此wait()方法只能在同步代码块中使用。而sleep方法可以在任何地方使用。但是注意sleep是静态方法,也就是说它只对当前对象有效。通过对象名.sleep()想让该对象线程进入休眠是无效的,它只会让当前线程进入休眠。

  3. sleep()方法的使用是需要使用try/catch来捕获异常的,而wait()方法不需要捕获异常,但会抛出InterruptedException异常,该异常是在线程阻塞时其他对象调用它的interrupt()产生的。

  4. 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线程在休眠的过程中并没有让出锁,而是继续持有锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值