4-让线程睡眠的sleep方法

让线程睡眠的sleep方法

  • Thread类有一个静态的sleep方法,当一个执行中的线程调用了Thread的sleep方法,调用线程就会让出指定时间的执行权,也就是在这期间不参与CPU调度,但是该线程持有的除了CPU以外的资源是不允许让出的,指定的睡眠时间到了后该函数会正常返回,线程就会处于就绪状态,然后参与CPU的调度,在获取到CPU的资源后就可以继续运行了。如果在睡眠期间被其他线程调用了interrupt()方法中断了该线程,则该线程会在调用sleep方法会抛出InterruptedException异常而返回。

    package com.heiye.temp;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class SleepTest2 {
        //创建一个独占锁
        public static final Lock lock=new ReentrantLock();
    
        public static void main(String[] args) {
            //创建线程A
            Thread threadA=new Thread(new Runnable() {
                @Override
                public void run() {
                    //获取独占锁
                    lock.lock();
                    try{
                        System.out.println("child threadA is in sleep");
                        Thread.sleep(10000);
                        System.out.println("child threadA is in awaked");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        //释放锁
                        lock.unlock();
                    }
                }
            });
    
            //创建线程B
            Thread threadB=new Thread(new Runnable() {
                @Override
                public void run() {
                    //获取独占锁
                    lock.lock();
                    try{
                        System.out.println("child threadB is in sleep");
                        Thread.sleep(10000);
                        System.out.println("child threadB is in awaked");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        //释放锁
                        lock.unlock();
                    }
                }
            });
    
            //启动线程
            threadA.start();
            threadB.start();
        }
    }
    

    image

    如上代码首先会创建一个独占锁,然后创建两个线程,每个线程在内部首先会获得锁,然后睡眠,睡眠结束后会释放锁,尽管A先睡眠,但是锁仍然是A的。

  • 当一个线程处于睡眠状态下,如果另外一个线程中断了它,会不会调用sleep方法判处异常?

    package com.heiye.temp;
    
    public class SleepTest3 {
        public static void main(String[] args) throws InterruptedException {
            //创建线程
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("child thread is in sleep");
                        Thread.sleep(10000);
                        System.out.println("child thread is in awaked");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            thread.start();
            //主线程休眠2秒
            Thread.sleep(2000);
            //主线程中断子线程
            thread.interrupt();
        }
    }
    

    image

  • 子线程在睡眠期间,主线程中断了它,所以子线程在调用sleep方法会判处InterruptedException异常。

posted @ 2021-09-23 13:09  LilyFlower  阅读(680)  评论(0编辑  收藏  举报