多线程面试_5

本文深入解析了Java中Thread类的sleep方法与Object类的wait方法的区别。sleep方法可在任意位置调用,仅让出CPU而不释放锁;而wait方法需在synchronized作用域内调用,会释放锁并允许其他线程访问资源。通过示例代码演示了两者的实际应用效果。

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

sleep和wait的区别

  1. sleep()是Thread类的方法,而wait是Object类中定义的方法.
  2. sleep()方法在任何地方都可以使用,而wait方法只能在synchronized(用于加锁)方法或者synchronized块中使用.
  3. Thread.sleep()只会让出cpu,不会导致锁行为的改变(可以理解为不会让资源),即如果当前线程是拥有锁的,那么该线程对象调用sleep()方法不会释放锁,只会让出CPU给其他任务执行,但是该线程所占有的资源其他线程依旧是无法访问的.
  4. Object.wait()不仅会让出CPU,还会释放已经占有的同步资源锁,即其他等待该资源的线程此时也是可以获取该资源来运行的,同时这也说明了为什么wait()方法要放在synchronized方法或者synchronized块中,因为我只能获取到了锁才可以释放锁嘛哈哈哈.
public class WaitSleepTest {
    public static void main(String[] args) {
        final Object lock = new Object();
        //通过wait执行等待
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("threadA is waiting to get lock...");
                synchronized (lock) {

                    try {
                        System.out.println("ThreadA get lock.");
                        Thread.sleep(20);
                        System.out.println("threadA do wait method");
                        lock.wait(1000);
                        System.out.println("threadA is done");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        //由于哪个线程先执行是不一定的,所以我们在这里让主线程休眠一会,等一会再让主线程去启动第二个线程
        try {
            //由于只等待了10毫秒,所以在线程Asleep的过程中线程B就启动了
            //因为sleep不会让资源,所以此时线程B只能处于等待状态
            //当线程A进入wait方法后,他会让时间和资源,所以线程B就会一直跑完,然后Await时间结束后自动跑完
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        //通过sleep执行等待
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("threadB is waiting to get lock...");
                synchronized (lock) {

                    try {
                        System.out.println("ThreadB get lock.");
                        System.out.println("threadB is sleeping 10 ms");
                        Thread.sleep(10);
                        System.out.println("threadB is done");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}
---运行结果

threadA is waiting to get lock...
ThreadA get lock.
threadB is waiting to get lock...
threadA do wait method
ThreadB get lock.
threadB is sleeping 10 ms
threadB is done
threadA is done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值