0
点赞
收藏
分享

微信扫一扫

java底层实现定时延时的途径

Timer定时器:

时间间隔示意:

请添加图片描述

例子一:

public class TestTimer {
    private static Timer timer = new Timer();
    private static Logger logger = LoggerFactory.getLogger("testtimer");

    public static void main(String[] args) {
        logger.info("开始------>{}", getNow());
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                logger.info("我是延时任务------>{}", getNow());
            }
        }, 2000L, 1000L);

        //    结果:
        //    16:20:28.710 [main] INFO testtimer - 开始------>2022-02-03 04:20:28
        //16:20:30.723 [Timer-0] INFO testtimer - 我是延时任务------>2022-02-03 04:20:30
        //16:20:31.722 [Timer-0] INFO testtimer - 我是延时任务------>2022-02-03 04:20:31
        //16:20:32.718 [Timer-0] INFO testtimer - 我是延时任务------>2022-02-03 04:20:32
        //16:20:33.723 [Timer-0] INFO testtimer - 我是延时任务------>2022-02-03 04:20:33
        //16:20:34.721 [Timer-0] INFO testtimer - 我是延时任务------>2022-02-03 04:20:34
        //16:20:35.722 [Timer-0] INFO testtimer - 我是延时任务------>2022-02-03 04:20:35
        //16:20:36.720 [Timer-0] INFO testtimer - 我是延时任务------>2022-02-03 04:20:36
        //16:20:37.718 [Timer-0] INFO testtimer - 我是延时任务------>2022-02-03 04:20:37
    }

    public static String getNow() {
        Date date = new Date(System.currentTimeMillis());
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        return dateFormat.format(date);
    }
}

例子二:

public class TestTimer {
    private static Timer timer = new Timer();
    private static Logger logger = LoggerFactory.getLogger("testtimer");
    private static Integer time = 0;

    public static void main(String[] args) {
        logger.info("开始------>{}", getNow());
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                time++;
                logger.info(time + "号延时任务开始------>{}", getNow());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                logger.info(time + "号延时任务结束------>{}", getNow());
            }
        }, 2000L, 2000L);

        //    结果:
        //    16:25:24.854 [main] INFO testtimer - 开始------>2022-02-03 04:25:24
        //16:25:26.882 [Timer-0] INFO testtimer - 1号延时任务开始------>2022-02-03 04:25:26
        //16:25:27.894 [Timer-0] INFO testtimer - 1号延时任务结束------>2022-02-03 04:25:27
        //16:25:28.881 [Timer-0] INFO testtimer - 2号延时任务开始------>2022-02-03 04:25:28
        //16:25:29.887 [Timer-0] INFO testtimer - 2号延时任务结束------>2022-02-03 04:25:29
        //16:25:30.881 [Timer-0] INFO testtimer - 3号延时任务开始------>2022-02-03 04:25:30
        //16:25:31.886 [Timer-0] INFO testtimer - 3号延时任务结束------>2022-02-03 04:25:31
        //16:25:32.880 [Timer-0] INFO testtimer - 4号延时任务开始------>2022-02-03 04:25:32
        //16:25:33.887 [Timer-0] INFO testtimer - 4号延时任务结束------>2022-02-03 04:25:33
        //16:25:34.877 [Timer-0] INFO testtimer - 5号延时任务开始------>2022-02-03 04:25:34
        //16:25:35.884 [Timer-0] INFO testtimer - 5号延时任务结束------>2022-02-03 04:25:35
        //16:25:36.881 [Timer-0] INFO testtimer - 6号延时任务开始------>2022-02-03 04:25:36
        //16:25:37.887 [Timer-0] INFO testtimer - 6号延时任务结束------>2022-02-03 04:25:37
    }

    public static String getNow() {
        Date date = new Date(System.currentTimeMillis());
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        return dateFormat.format(date);
    }
}

Thread.sleep():

/**
 * Causes the currently executing thread to sleep (temporarily cease
 * execution) for the specified number of milliseconds, subject to
 * the precision and accuracy of system timers and schedulers. The thread
 * does not lose ownership of any monitors.
 *
 * @param  millis
 *         the length of time to sleep in milliseconds
 *
 * @throws  IllegalArgumentException
 *          if the value of {@code millis} is negative
 *
 * @throws  InterruptedException
 *          if any thread has interrupted the current thread. The
 *          <i>interrupted status</i> of the current thread is
 *          cleared when this exception is thrown.
 */
public static native void sleep(long millis) throws InterruptedException;

上面的定时任务已经用到了,入参是毫秒数,当前线程沉睡的毫秒数

举报

相关推荐

0 条评论