Java多线程之-Sleep方法详解

sleep方法详解

  • 作用:我只想让线程在于其的时间执行,其他时候不要占用CPU资源。
  • 特点
    • 不释放锁 包括synchronize 和lock 和wait不同
public class SleepDontReleaseMonitor implements Runnable {

    public static void main(String[] args) {
        SleepDontReleaseMonitor sleepDontReleaseMonitor = new SleepDontReleaseMonitor();
        Thread thread1 = new Thread(sleepDontReleaseMonitor);
        Thread thread2 =new Thread(sleepDontReleaseMonitor);
        thread1.start();
        thread2.start();
    }
    public void run() {
        syn();
    }

    private synchronized void syn()  {
        System.out.println("线程" + Thread.currentThread().getName()+"获取到monitor。");
        try{
            Thread.sleep(5000);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("线程" + Thread.currentThread().getName()+"睡眠结束。退出同步代码块");
    }
}

在这里插入图片描述
可以看出线程在sleep()时并不会把锁给释放。


Sleep 同时也并不会释放Lock锁

public class SleepDontReleaseLcok implements  Runnable {
    private static final Lock lock = new ReentrantLock();
    public void run() {
        lock.lock();
        System.out.println("线程" +Thread.currentThread().getName() +"获取到了锁");
        try {
            Thread.sleep(5000);
            System.out.println("线程" +Thread.currentThread().getName() +"已经唤醒");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }

    }

    public static void main(String[] args) {
        SleepDontReleaseLcok sleepDontReleaseLcok = new SleepDontReleaseLcok();
        Thread  thread1 = new Thread(sleepDontReleaseLcok);
        Thread  thread2 = new Thread(sleepDontReleaseLcok);
        thread1.start();
        thread2.start();
    }
}

sleep方法响应中断

  1. 抛出InterruptedException
  2. 清除中断状态
public class SleepInterrupt implements  Runnable{
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 =  new Thread(new SleepInterrupt());
        thread1.start();
        Thread.sleep(6500);
        thread1.interrupt();

    }

    public void run() {
        for(int i =0;i<10;i++){
            System.out.println(new Date());
            try{
                //sleep7小时 5 分钟 3秒
                TimeUnit.HOURS.sleep(7);
                TimeUnit.SECONDS.sleep(5);
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                System.out.println("被中断了!");
                e.printStackTrace();
            }

        }
    }
}

在这里插入图片描述

sleep方法可以让线程进入Watting状态,并且不占用CPU资源,但是不释放锁,直到规定时间后再执行,休眠期间如果被中断,会抛出异常并清除中断状态。

sleep方法—常见面试问题

wait/notify、sleep异同

  • 相同
    • 阻塞(都会阻塞线程)
    • 响应中断(都会相应线程中断 并清除中断状态)
  • 不同
    • 同步方法中(wait/notify 必须在同步方法块 中 而sleep不需要 为什么?线程更安全防止死锁和永久等待)
    • 释放锁(wait会释放锁 但是sleep不会)
    • 指定时间(sleep 要指定时间)
    • 所属类(wait/notify 属于Object 类 sleep 属于Thread类 为什么放Object类? java设计每一个类都是一把锁 对象头都有记录锁的字段)
发布了67 篇原创文章 · 获赞 5 · 访问量 3187

猜你喜欢

转载自blog.csdn.net/weixin_41315492/article/details/103050246