java线程休眠之sleep

    科技2025-10-20  10

    Sleep方法介绍

    sleep方法是Thread类中的一个静态方法,当一个执行中的线程调用了Thread的sleep方法之后,调用线程会暂时让出指定时间的执行权,这期间不参与CPU的调度,但是该线程所拥有的监视器资源,比如锁还是持有且不让出的。指定的睡眠时间到了之后,sleep函数会正常返回,线程就处于就绪状态,然后参与CPU调度,获取到CPU的资源后就可以运行了。

    线程睡眠时不释放拥有的监视器资源

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SleepTest { private static final Lock lock = new ReentrantLock(); public static void main(String[] args) { Thread threadA = new Thread(new Runnable() { @Override public void run() { lock.lock(); try { System.out.println("threadA is in sleep"); Thread.sleep(1000); System.out.println("threadA is in awaked"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { lock.lock(); try { System.out.println("threadB is in sleep"); Thread.sleep(1000); System.out.println("threadB is in awaked"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }); threadA.start(); threadB.start(); } }

    输出结果:

    threadA is in sleep threadA is in awaked threadB is in sleep threadB is in awaked

    看输出结果可以得出,threadA 休眠期间没有释放监视器锁,因此,threadB无法获取到该监视器锁。

    休眠线程被中断之后会抛出异常

    public class SleepInterrupt { public static void main(String[] args) throws InterruptedException { Thread threadA = new Thread(new Runnable() { @Override public void run() { try { System.out.println("threadA is in sleep"); Thread.sleep(10000); System.out.println("threadA is in awaked"); } catch (InterruptedException e) { e.printStackTrace(); } } }); threadA.start(); Thread.sleep(2000); threadA.interrupt(); } }

    输出结果:

    threadA is in sleep java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.tim.base.easystart.thread.base.SleepInterrupt$1.run(SleepInterrupt.java:11) at java.lang.Thread.run(Thread.java:748)

    Processed: 0.012, SQL: 9