• 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);
            }
        }
    
    }
  • 相关阅读:
    Palindrome Linked List 解答
    Word Break II 解答
    Array vs Linked List
    Reverse Linked List II 解答
    Calculate Number Of Islands And Lakes 解答
    Sqrt(x) 解答
    Find Median from Data Stream 解答
    Majority Element II 解答
    Binary Search Tree DFS Template
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/sonofelice/p/5597789.html
Copyright © 2020-2023  润新知