4.让线程睡眠的sleep方法

1.4 让线程睡眠的sleep方法

Thread 类中有一个静态方法的sleep方法,当该线程调用sleep方法后,就会暂时让CPU的调度权。但是监视器资源比如锁并不会释放出去。在指定睡眠时间后,函数会正常返回。如果线程在睡眠过程中如果如果调用了该线程的interrupt方法终端该线程,则会抛出sleep内的InterruptedException异常而返回。

  下面举个例子,该线程在睡眠的拥有的监视器并不会被释放。

package com.example.demo.runnable.ChapterOne;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author 49800
 */
public class SleepTest {

    private static final ReentrantLock lock = new ReentrantLock();
    public static void main(String[] args) {
        Thread threadA = new Thread(() -> {
            lock.lock();
            try {
                System.out.println("ThreadA 在执行了");
                Thread.sleep(10000);
                System.out.println("ThreadA 执行完成了");
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        });
        Thread threadB = new Thread(() -> {
            lock.lock();
            try {
                System.out.println("ThreadB 在执行了");
                Thread.sleep(10000);
                System.out.println("ThreadB 执行完成了");

            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        });


        threadA.start();
        threadB.start();
        System.out.println("Main 方法已经在执行了");
        try {
            threadA.join();
            threadB.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Main 方法已经在执行完成了");
    }
}

4.让线程睡眠的sleep方法_第1张图片
  上面用到了独占锁,独占锁就是当一个线程在使用该锁的时候,另一个线程必须等另一个线程释放锁后,下一个线程才能执行。这样上面两个线程就不会交叉执行。从上面的执行结果来看,当某一线程在在开始执行后。执行到sleep方法,就暂停十秒才会打印执行完成。因为调用了join的方法,所以必须这两个线程执行完成后才能执行main方法。在线程睡眠时,其他线程调用该线程的sleep方法,则会抛出异常。

package com.example.demo.runnable.ChapterOne;

/**
 * @author 49800
 */
public class SleepExceptionTest {

    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            try {
                System.out.println("开始执行");
                Thread.sleep(10000);
                System.out.println("执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        thread.start();
        try {
            // Main 方法睡眠3s
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();
    }
}

结果:
4.让线程睡眠的sleep方法_第2张图片

  子线程在睡眠期间,主线程中断了他,所以在主线程在调用sleep方法后抛出了异常。另外需要注意的事sleep(long millis)是毫秒值,当传入的是一个负数的时候也是会抛出异常的。

你可能感兴趣的:(java,多线程,thread)