java之TimeUnit.SECONDS.sleep()详细分析(全)

目录

  • 前言
  • 1. 源码
    • 1.1 TimeUnit.SECONDS.sleep()
    • 1.2 Thread.sleep()
  • 2. 代码实战
  • 3. 代码对比

前言

TimeUnit是java.util.concurrent包下的一个类名
主要功能是暂停线程的操作
与Thread.sleep()一样的功能都是暂停线程

  • TimeUnit.SECONDS.sleep()这个方法可以精确到任意时间,指定DAYS、HOURS、MINUTES,SECONDS、MILLISECONDS和NANOSECONDS
  • Thread.sleep()参数可以如下:(可查看下面源码解释)
    java之TimeUnit.SECONDS.sleep()详细分析(全)_第1张图片

1. 源码

1.1 TimeUnit.SECONDS.sleep()

枚举变量主要有(参数选择主要有)
很有可读性

变量 意思
NANOSECONDS 毫微秒
MICROSECONDS 微秒
MILLISECONDS 毫秒
SECONDS
MINUTES 分钟
HOURS 小时
DAYS

查看其源码
在暂停时间方面都有很高的精确性
转换时间以及验证

public void sleep(long timeout) throws InterruptedException {
        if (timeout > 0) {
            long ms = toMillis(timeout);
            int ns = excessNanos(timeout, ms);
            Thread.sleep(ms, ns);
        }
    }

而且可以指定一些枚举变量
每一部分枚举变量都有其方法
参数多选择多
比如下方的分钟

public long toSeconds(long duration) {
        long s, m;
        if ((s = scale) <= SECOND_SCALE)
            return (s == SECOND_SCALE) ? duration : duration / secRatio;
        else if (duration > (m = maxSecs))
            return Long.MAX_VALUE;
        else if (duration < -m)
            return Long.MIN_VALUE;
        else
            return duration * secRatio;
    }

1.2 Thread.sleep()

对应的sleep()函数,查看其源码函数,主要有如下两个功能:

// 其设计的两个源码如下:

/*
Millis -以毫秒为单位的睡眠时间长度
IllegalArgumentException  millis的值是负数
InterruptedException  如果任何线程中断了当前线程。抛出此异常时,当前线程的中断状态将被清除。
*/
public static native void sleep(long millis) throws InterruptedException;


/*
使当前正在执行的线程休眠(临时停止执行),休眠时间为指定的毫秒数加上指定的纳秒数,具体取决于系统计时器和调度器的精度和准确性。线程不会失去任何监视器的所有权
*/

/*
Millis 以毫秒纳为单位的睡眠时间长度
nanos 表示为0到999999 纳秒额外的睡眠时间
对应的异常表示为:如果millis的值为负值,或者nano的值不在0-999999的范围内
*/
public static void sleep(long millis, int nanos)
	//InterruptedException异常表示 如果任何线程中断了当前线程。抛出此异常时,当前线程的中断状态将被清除
    throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
            millis++;
        }

        sleep(millis);
    }

2. 代码实战

通过结合线程进程的操作
暂停该线程,将其挂起,可以运用该代码
指定暂停一秒,将其挂起

TimeUnit.MINUTES.sleep(1);

3. 代码对比

Thread.sleep()一样的功能都是暂停线程
但是TimeUnit.SECONDS.sleep()更具有可读性

Thread.sleep()可读性低,但调用都是同样功能
TimeUnit.SECONDS.sleep()参数选择多,枚举变量的参数具体可查看上方

Thread.sleep()代码实列比如
Thread.sleep(5*60*1000);这样比较有可读性,但乘起来可读性较低

你可能感兴趣的:(java,多线程,java,jdk,操作系统)