栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【jeecg-boot项目开发crm】:平台技术点——day05【Java定时任务解决方案:Timer解析】:图灵课堂

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【jeecg-boot项目开发crm】:平台技术点——day05【Java定时任务解决方案:Timer解析】:图灵课堂

三、Timer解析 Timer的基本使用流程
  • 第一件事:new一个timer(计时器)
  • 第二件事:定义一个任务TimerTask类【这里起名字为FooTimerTask】
    • 包装一个定时任务:任务写在下面的一个类FooTimerTask(这个类需要继承TimerTask)
    • 这个TimerTask实现了Runable接口(所以需要自己实现run()方法)。
    • 在run()方法里写业务逻辑
      • 模拟延时时间
      • 定义一个变量
      • 通过构造器来传入自己定义的日志名字
  • Timer就两件事,然后就是启动项目了
    • new一个对象
    • 然后即使启动任务的方法
      • schedule()
      • scheduleAtFixedRate()
// 预设的执行时间nextExecutTime 12:00:00   12:00:02  12:00:04
//schedule  真正的执行时间 取决上一个任务的结束时间  ExecutTime   03  05  08  丢任务(少执行了次数)
//scheduleAtFixedRate  严格按照预设时间 12:00:00   12:00:02  12:00:04(执行时间会乱)
//单线程  任务阻塞  任务超时
Timer基本使用的缺点
  • 该方法的缺点,不管你放多少任务,都是以单线程来运行的(源码里写的)。
  • 单线程就会导致——任务阻塞,任务超时
解决单线程导致的任务阻塞,超时的方法:【正确的用法】
  • 在TimerTask中的run()方法里面另起线程池【自己写】执行(这样就可以避免了)
使用场景:
  • 必须是固定的时间,要不就是相对的时间。
  • 每个月的一号执行就会做不到【严重依赖系统时间】。
代码展示:
  • 需要使用就需要自己另起线程池,启动多线程
package com.tuling.timer;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerTest {

    public static void main(String[] args) {
        Timer t = new Timer();//任务启动
        for (int i=0; i<2; i++){
            TimerTask task = new FooTimerTask("foo"+i);
            t.scheduleAtFixedRate(task,new Date(),2000);//任务添加   10s 5次   4 3
            // 预设的执行时间nextExecutTime 12:00:00   12:00:02  12:00:04
            //schedule  真正的执行时间 取决上一个任务的结束时间  ExecutTime   03  05  08  丢任务(少执行了次数)
            //scheduleAtFixedRate  严格按照预设时间 12:00:00   12:00:02  12:00:04(执行时间会乱)
            //单线程  任务阻塞  任务超时
        }
    }
}
class FooTimerTask extends TimerTask {

    private String name;

    public FooTimerTask(String name) {
        this.name = name;
    }

    public void run() {
        try {
            System.out.println("name="+name+",startTime="+new Date());
            Thread.sleep(3000);
            System.out.println("name="+name+",endTime="+new Date());

            //线程池执行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

问题补充图:应用,任务调度,问题



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531948.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号