zoukankan      html  css  js  c++  java
  • TimeUnit枚举类

    TimeUnit是  java.util.concurrent 中的一个枚举类。一般让线程进行睡眠时使用:

    TimeUnit.MILLISECONDS.sleep(100);

    比如上面一行代码表示让当前线程睡眠100毫秒。

    相比Thread.sleep()方法的一个好处就是, TimeUnit可以设置时间单位,比如上面的毫秒级别,看下面源码,有7个选项,纳秒、微妙、毫秒、秒、分钟、小时、天。

    package java.util.concurrent;
    
    /**
     * A <tt>TimeUnit</tt> represents time durations at a given unit of
     * granularity and provides utility methods to convert across units,
     * and to perform timing and delay operations in these units.  A
     * <tt>TimeUnit</tt> does not maintain time information, but only
     * helps organize and use time representations that may be maintained
     * separately across various contexts.  A nanosecond is defined as one
     * thousandth of a microsecond, a microsecond as one thousandth of a
     * millisecond, a millisecond as one thousandth of a second, a minute
     * as sixty seconds, an hour as sixty minutes, and a day as twenty four
     * hours.
     *
     * <p>A <tt>TimeUnit</tt> is mainly used to inform time-based methods
     * how a given timing parameter should be interpreted. For example,
     * the following code will timeout in 50 milliseconds if the {@link
     * java.util.concurrent.locks.Lock lock} is not available:
     *
     * <pre>  Lock lock = ...;
     *  if (lock.tryLock(50L, TimeUnit.MILLISECONDS)) ...
     * </pre>
     * while this code will timeout in 50 seconds:
     * <pre>
     *  Lock lock = ...;
     *  if (lock.tryLock(50L, TimeUnit.SECONDS)) ...
     * </pre>
     *
     * Note however, that there is no guarantee that a particular timeout
     * implementation will be able to notice the passage of time at the
     * same granularity as the given <tt>TimeUnit</tt>.
     *
     * @since 1.5
     * @author Doug Lea
     */
    public enum TimeUnit {
        NANOSECONDS {
            public long toNanos(long d)   { return d; }
            public long toMicros(long d)  { return d/(C1/C0); }
            public long toMillis(long d)  { return d/(C2/C0); }
            public long toSeconds(long d) { return d/(C3/C0); }
            public long toMinutes(long d) { return d/(C4/C0); }
            public long toHours(long d)   { return d/(C5/C0); }
            public long toDays(long d)    { return d/(C6/C0); }
            public long convert(long d, TimeUnit u) { return u.toNanos(d); }
            int excessNanos(long d, long m) { return (int)(d - (m*C2)); }
        },
        MICROSECONDS {
            public long toNanos(long d)   { return x(d, C1/C0, MAX/(C1/C0)); }
            public long toMicros(long d)  { return d; }
            public long toMillis(long d)  { return d/(C2/C1); }
            public long toSeconds(long d) { return d/(C3/C1); }
            public long toMinutes(long d) { return d/(C4/C1); }
            public long toHours(long d)   { return d/(C5/C1); }
            public long toDays(long d)    { return d/(C6/C1); }
            public long convert(long d, TimeUnit u) { return u.toMicros(d); }
            int excessNanos(long d, long m) { return (int)((d*C1) - (m*C2)); }
        },
        MILLISECONDS {
            public long toNanos(long d)   { return x(d, C2/C0, MAX/(C2/C0)); }
            public long toMicros(long d)  { return x(d, C2/C1, MAX/(C2/C1)); }
            public long toMillis(long d)  { return d; }
            public long toSeconds(long d) { return d/(C3/C2); }
            public long toMinutes(long d) { return d/(C4/C2); }
            public long toHours(long d)   { return d/(C5/C2); }
            public long toDays(long d)    { return d/(C6/C2); }
            public long convert(long d, TimeUnit u) { return u.toMillis(d); }
            int excessNanos(long d, long m) { return 0; }
        },
        SECONDS {
            public long toNanos(long d)   { return x(d, C3/C0, MAX/(C3/C0)); }
            public long toMicros(long d)  { return x(d, C3/C1, MAX/(C3/C1)); }
            public long toMillis(long d)  { return x(d, C3/C2, MAX/(C3/C2)); }
            public long toSeconds(long d) { return d; }
            public long toMinutes(long d) { return d/(C4/C3); }
            public long toHours(long d)   { return d/(C5/C3); }
            public long toDays(long d)    { return d/(C6/C3); }
            public long convert(long d, TimeUnit u) { return u.toSeconds(d); }
            int excessNanos(long d, long m) { return 0; }
        },
        MINUTES {
            public long toNanos(long d)   { return x(d, C4/C0, MAX/(C4/C0)); }
            public long toMicros(long d)  { return x(d, C4/C1, MAX/(C4/C1)); }
            public long toMillis(long d)  { return x(d, C4/C2, MAX/(C4/C2)); }
            public long toSeconds(long d) { return x(d, C4/C3, MAX/(C4/C3)); }
            public long toMinutes(long d) { return d; }
            public long toHours(long d)   { return d/(C5/C4); }
            public long toDays(long d)    { return d/(C6/C4); }
            public long convert(long d, TimeUnit u) { return u.toMinutes(d); }
            int excessNanos(long d, long m) { return 0; }
        },
        HOURS {
            public long toNanos(long d)   { return x(d, C5/C0, MAX/(C5/C0)); }
            public long toMicros(long d)  { return x(d, C5/C1, MAX/(C5/C1)); }
            public long toMillis(long d)  { return x(d, C5/C2, MAX/(C5/C2)); }
            public long toSeconds(long d) { return x(d, C5/C3, MAX/(C5/C3)); }
            public long toMinutes(long d) { return x(d, C5/C4, MAX/(C5/C4)); }
            public long toHours(long d)   { return d; }
            public long toDays(long d)    { return d/(C6/C5); }
            public long convert(long d, TimeUnit u) { return u.toHours(d); }
            int excessNanos(long d, long m) { return 0; }
        },
        DAYS {
            public long toNanos(long d)   { return x(d, C6/C0, MAX/(C6/C0)); }
            public long toMicros(long d)  { return x(d, C6/C1, MAX/(C6/C1)); }
            public long toMillis(long d)  { return x(d, C6/C2, MAX/(C6/C2)); }
            public long toSeconds(long d) { return x(d, C6/C3, MAX/(C6/C3)); }
            public long toMinutes(long d) { return x(d, C6/C4, MAX/(C6/C4)); }
            public long toHours(long d)   { return x(d, C6/C5, MAX/(C6/C5)); }
            public long toDays(long d)    { return d; }
            public long convert(long d, TimeUnit u) { return u.toDays(d); }
            int excessNanos(long d, long m) { return 0; }
        };
    
        // Handy constants for conversion methods
        static final long C0 = 1L;
        static final long C1 = C0 * 1000L;
        static final long C2 = C1 * 1000L;
        static final long C3 = C2 * 1000L;
        static final long C4 = C3 * 60L;
        static final long C5 = C4 * 60L;
        static final long C6 = C5 * 24L;
    
        static final long MAX = Long.MAX_VALUE;
    
        /**
         * Scale d by m, checking for overflow.
         * This has a short name to make above code more readable.
         */
        static long x(long d, long m, long over) {
            if (d >  over) return Long.MAX_VALUE;
            if (d < -over) return Long.MIN_VALUE;
            return d * m;
        }
    
        // To maintain full signature compatibility with 1.5, and to improve the
        // clarity of the generated javadoc (see 6287639: Abstract methods in
        // enum classes should not be listed as abstract), method convert
        // etc. are not declared abstract but otherwise act as abstract methods.
    
        /**
         * Convert the given time duration in the given unit to this
         * unit.  Conversions from finer to coarser granularities
         * truncate, so lose precision. For example converting
         * <tt>999</tt> milliseconds to seconds results in
         * <tt>0</tt>. Conversions from coarser to finer granularities
         * with arguments that would numerically overflow saturate to
         * <tt>Long.MIN_VALUE</tt> if negative or <tt>Long.MAX_VALUE</tt>
         * if positive.
         *
         * <p>For example, to convert 10 minutes to milliseconds, use:
         * <tt>TimeUnit.MILLISECONDS.convert(10L, TimeUnit.MINUTES)</tt>
         *
         * @param sourceDuration the time duration in the given <tt>sourceUnit</tt>
         * @param sourceUnit the unit of the <tt>sourceDuration</tt> argument
         * @return the converted duration in this unit,
         * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
         * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
         */
        public long convert(long sourceDuration, TimeUnit sourceUnit) {
            throw new AbstractMethodError();
        }
    
        /**
         * Equivalent to <tt>NANOSECONDS.convert(duration, this)</tt>.
         * @param duration the duration
         * @return the converted duration,
         * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
         * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
         * @see #convert
         */
        public long toNanos(long duration) {
            throw new AbstractMethodError();
        }
    
        /**
         * Equivalent to <tt>MICROSECONDS.convert(duration, this)</tt>.
         * @param duration the duration
         * @return the converted duration,
         * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
         * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
         * @see #convert
         */
        public long toMicros(long duration) {
            throw new AbstractMethodError();
        }
    
        /**
         * Equivalent to <tt>MILLISECONDS.convert(duration, this)</tt>.
         * @param duration the duration
         * @return the converted duration,
         * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
         * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
         * @see #convert
         */
        public long toMillis(long duration) {
            throw new AbstractMethodError();
        }
    
        /**
         * Equivalent to <tt>SECONDS.convert(duration, this)</tt>.
         * @param duration the duration
         * @return the converted duration,
         * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
         * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
         * @see #convert
         */
        public long toSeconds(long duration) {
            throw new AbstractMethodError();
        }
    
        /**
         * Equivalent to <tt>MINUTES.convert(duration, this)</tt>.
         * @param duration the duration
         * @return the converted duration,
         * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
         * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
         * @see #convert
         * @since 1.6
         */
        public long toMinutes(long duration) {
            throw new AbstractMethodError();
        }
    
        /**
         * Equivalent to <tt>HOURS.convert(duration, this)</tt>.
         * @param duration the duration
         * @return the converted duration,
         * or <tt>Long.MIN_VALUE</tt> if conversion would negatively
         * overflow, or <tt>Long.MAX_VALUE</tt> if it would positively overflow.
         * @see #convert
         * @since 1.6
         */
        public long toHours(long duration) {
            throw new AbstractMethodError();
        }
    
        /**
         * Equivalent to <tt>DAYS.convert(duration, this)</tt>.
         * @param duration the duration
         * @return the converted duration
         * @see #convert
         * @since 1.6
         */
        public long toDays(long duration) {
            throw new AbstractMethodError();
        }
    
        /**
         * Utility to compute the excess-nanosecond argument to wait,
         * sleep, join.
         * @param d the duration
         * @param m the number of milliseconds
         * @return the number of nanoseconds
         */
        abstract int excessNanos(long d, long m);
    
        /**
         * Performs a timed {@link Object#wait(long, int) Object.wait}
         * using this time unit.
         * This is a convenience method that converts timeout arguments
         * into the form required by the <tt>Object.wait</tt> method.
         *
         * <p>For example, you could implement a blocking <tt>poll</tt>
         * method (see {@link BlockingQueue#poll BlockingQueue.poll})
         * using:
         *
         *  <pre> {@code
         * public synchronized Object poll(long timeout, TimeUnit unit)
         *     throws InterruptedException {
         *   while (empty) {
         *     unit.timedWait(this, timeout);
         *     ...
         *   }
         * }}</pre>
         *
         * @param obj the object to wait on
         * @param timeout the maximum time to wait. If less than
         * or equal to zero, do not wait at all.
         * @throws InterruptedException if interrupted while waiting
         */
        public void timedWait(Object obj, long timeout)
                throws InterruptedException {
            if (timeout > 0) {
                long ms = toMillis(timeout);
                int ns = excessNanos(timeout, ms);
                obj.wait(ms, ns);
            }
        }
    
        /**
         * Performs a timed {@link Thread#join(long, int) Thread.join}
         * using this time unit.
         * This is a convenience method that converts time arguments into the
         * form required by the <tt>Thread.join</tt> method.
         *
         * @param thread the thread to wait for
         * @param timeout the maximum time to wait. If less than
         * or equal to zero, do not wait at all.
         * @throws InterruptedException if interrupted while waiting
         */
        public void timedJoin(Thread thread, long timeout)
                throws InterruptedException {
            if (timeout > 0) {
                long ms = toMillis(timeout);
                int ns = excessNanos(timeout, ms);
                thread.join(ms, ns);
            }
        }
    
        /**
         * Performs a {@link Thread#sleep(long, int) Thread.sleep} using
         * this time unit.
         * This is a convenience method that converts time arguments into the
         * form required by the <tt>Thread.sleep</tt> method.
         *
         * @param timeout the minimum time to sleep. If less than
         * or equal to zero, do not sleep at all.
         * @throws InterruptedException if interrupted while sleeping
         */
        public void sleep(long timeout) throws InterruptedException {
            if (timeout > 0) {
                long ms = toMillis(timeout);
                int ns = excessNanos(timeout, ms);
                Thread.sleep(ms, ns);
            }
        }
    
    }
  • 相关阅读:
    devexpress toolbar 填充整行宽度
    2. Rust的三板斧 安全,迅速,并发
    1. rust的优点
    谈谈我对sku的理解(3)----页面效果
    谈谈我对sku的理解(2)----数据库设计
    谈谈我对sku的理解(1)
    我眼里的奇酷手机360OS
    Oracle中的wm_concat()函数
    获取java本地系统信息 Properties
    java 获取用户的ip都是 127.0.0.1
  • 原文地址:https://www.cnblogs.com/sonofelice/p/5597789.html
Copyright © 2011-2022 走看看