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方法响应中断
- 抛出InterruptedException
- 清除中断状态
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设计每一个类都是一把锁 对象头都有记录锁的字段)