zoukankan      html  css  js  c++  java
  • 架构系列——定时任务中的Timer类使用简析

    作者专注于Java、架构、Linux、小程序、爬虫、自动化等技术。 工作期间含泪整理出一些资料,微信搜索【程序员高手之路】,回复 【java】【黑客】【爬虫】【小程序】【面试】等关键字免费获取资料。技术交流、项目合作可私聊:shuhao-99999。

    前言

    该类位于java.util包下

    最近项目用到了Timer类(用于定时任务),记录一下要点与心得,方便以后查看

    一、源码中的几个方法

    1.经过delay(ms)后开始进行调度一次

    2.在指定的时间点time上调度一次

     

    3.在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调(算是周期性调度任务)

    4.跟第3个一样,也是周期性调度任务,只是第二个参数为第一次调度的时间

    二、案例

    package com.test.client;
    
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    /**  
     * @ClassName: Test  
     * @Description:   
     * @author: hanshuhao  
     * @date: 2019年10月29日
     */
    public class TestTimer {
        public static void main(String[] args) throws InterruptedException{
            Timer timer = new Timer();
            Calendar calendar = Calendar.getInstance();
            //开始时间为当前时间+3秒
            calendar.add(Calendar.SECOND, 3);
            Date startDate = calendar.getTime();
            System.out.println(startDate);
            
            TimerTask task = new Mytask("my_task1");
            TimerTask task2 = new Mytask("my_task2");
            //timer每隔5秒调用一次task
            timer.schedule(task, startDate, 5000);
            timer.schedule(task2, startDate, 5000);
            
            //测试守护线程
    //        while(true) {
    //            System.out.println("running...");
    //            Thread.sleep(10000);
    //            break;
    //        }
        }
    }
    
    class Mytask extends TimerTask{
        String taskName = "";
        public Mytask(String name) {
            this.taskName = name;
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            Thread thread = new Thread(() -> {
                try {
                    System.out.println("the task " + this.taskName + " begin at " + System.currentTimeMillis());
                    Thread.sleep(3000);
                    System.out.println("the task " + this.taskName + " done at " + System.currentTimeMillis());
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            });
            thread.start();
        }
    }

    三、扩展

    Timer类有个带boolean参数的构造方法,里面可以填写是否为守护线程。顺便把守护线程也了解了一下,简单来说,只要有用户线程在运行,守护线程就不会停掉。(参考: Java中守护线程的总结

    OK,GAME OVER

  • 相关阅读:
    极客技术专题【008期】:CSS3核心技术:选择器
    10670 Work Reduction (贪心 + 被题意坑了- -)y
    hdu 4617 : Weapon
    [poj 2186]Popular Cows[Tarjan强连通分量]
    caldera
    linux内核书籍
    DedeCMS Error:Tag disabled:"php"的解决办法
    China特色创新现状
    麒麟OS剽窃
    国产系统
  • 原文地址:https://www.cnblogs.com/shuhao66666/p/12925387.html
Copyright © 2011-2022 走看看