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

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

  • 2021-11-16
  • Admin

四、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(执行时间会乱)
//单线程  任务阻塞  任务超时
  • 1
  • 2
  • 3
  • 4

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();
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原文:https://blog.csdn.net/qq_40572023/article/details/121361092

联系站长

QQ:769220720