java线程休眠之sleep

大鹅啊 6339 6435

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)

结尾

本文到这里就结束了,感谢看到最后的朋友,都看到最后了,点个赞再走啊,如有不对之处还请多多指正。

抱歉,评论功能暂时关闭!