java定时任务实现的4种方式小结

1. java自带的Timer

 Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        System.out.println("Time's up!");

      }
    },3*1000,1000);

2.ScheduledThreadPool-线程池

 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
    scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
      @Override
      public void run() {
        System.out.println("=========================");
      }
    }, 1000, 2000, TimeUnit.MILLISECONDS);

    scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
      @Override
      public void run() {
        System.out.println(System.currentTimeMillis()+"<><>"+System.nanoTime());
      }
    }, 1000, 2000, TimeUnit.MILLISECONDS);

3.使用注解的形式:@Scheduled

@Component
public class SpringScheduled {

  @Scheduled(initialDelay = 2000,fixedDelay = 5000)
  public void doSomething() {
    System.out.println("Spring自带的Scheduled执行了=======================");
  }
}
//下面是开启
@SpringBootApplication
@EnableScheduling
public class DemoApplication {

  public static void main(String[] args) throws InterruptedException {
    SpringApplication application = new SpringApplication(DemoApplication.class);
    application.addListeners(new ContextRefreshedEventListener());
    application.run(args);
  }
}

4.使用Quartz定时任务调度器

配置

@Configuration
public class QuartzConfig { 

  @Resource
  private ScheduleTask scheduleTask;

  /**
   * 配置定时任务1
   * @return
   */
  @Bean(name="firstJobDetail")
  public MethodInvokingJobDetailFactoryBean firstJobDetail(){
    MethodInvokingJobDetailFactoryBean method = new MethodInvokingJobDetailFactoryBean();
    // 为需要执行的实体类对应的对象
    method.setTargetObject(scheduleTask);
    // 需要执行的方法
    method.setTargetMethod("test");
    // 是否并发执行
    method.setConcurrent(false);
    return method;
  } 

  /**
   *  配置触发器1
   *  @param firstJobDetail
   *  @return
   */
  @Bean(name="firstTrigger")
  public SimpleTriggerFactoryBean firstTrigger(JobDetail firstJobDetail){
    SimpleTriggerFactoryBean simpleBean = new SimpleTriggerFactoryBean();
    simpleBean.setJobDetail(firstJobDetail);
    // 设置任务启动延迟
    simpleBean.setStartDelay(1000);
    // 每1秒执行一次
    simpleBean.setRepeatInterval(1000);
    //设置重复计数
    //simpleBean.setRepeatCount(0);
    return simpleBean;
  }

  /**
   * 配置Scheduler
   */
  @Bean(name = "scheduler")
  public SchedulerFactoryBean schedulerFactoryBean(Trigger firstTrigger){
    SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
    factoryBean.setTriggers(firstTrigger);
    return factoryBean;
  }
}

要执行的任务

@Component
public class ScheduleTask {

  public void test() {
    System.out.println("====================================");
  }

}

总结:

还有其他方式可以实现定时任务的方式,可以贴出来,讨论讨

补充知识:SpringBoot定时任务简单使用和自定义开启关闭修改周期

一、简单使用

1.pom加入基本springboot基本的starter即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
   <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
  </dependency>

2.@Scheduled 参数可以接受两种定时的设置,一种是我们常用的cron="*/6 * * * * ?",一种是 fixedRate = 6000,两种都表示每隔六秒打印一下内容。

fixedRate 说明

@Scheduled(fixedRate = 6000) :上一次开始执行时间点之后6秒再执行

@Scheduled(fixedDelay = 6000) :上一次执行完毕时间点之后6秒再执行

@Scheduled(initialDelay=1000, fixedRate=6000) :第一次延迟1秒后执行,之后按fixedRate的规则每6秒执行一次

@Component
public class TimingTask {
 private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
  @Scheduled(cron="*/6 * * * * ?")
  private void process(){
  System.out.println("this is scheduler task runing "+new Date());
  }
  @Scheduled(fixedRate = 6000)
  public void reportCurrentTime() {
    System.out.println("现在时间:" + dateFormat.format(new Date()));
  }
}

3.启动类加上@EnableScheduling注解。

@SpringBootApplication(exclude = MongoAutoConfiguration.class)
@EnableScheduling
public class DemoApplication {
 public static void main(String[] args) {
 SpringApplication.run(DemoApplication.class, args);
 }

}

4.运行结果

this is scheduler task runing Thu Jul 18 10:59:06 CST 2019
现在时间:10:59:10
this is scheduler task runing Thu Jul 18 10:59:12 CST 2019
现在时间:10:59:16
this is scheduler task runing Thu Jul 18 10:59:18 CST 2019
现在时间:10:59:22
this is scheduler task runing Thu Jul 18 10:59:24 CST 2019
现在时间:10:59:28

以上就是定时任务的简单使用。但是有时候,定时任务需要关闭,和开启,或者修改定时任务的运行周期,可以使用下面的方式实现.

二、高级使用,自定义定时任务,关闭,开启,修改周期

1.说明

ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度。

ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)

在ScheduledFuture中有一个cancel可以停止定时任务。

@RestController
@RequestMapping("/time")
public class DynamicScheduledTask {
 private static String DEFAULT_CRON = "0/5 * * * * ?";
 @Autowired
  private ThreadPoolTaskScheduler threadPoolTaskScheduler;
  private ScheduledFuture<?> future;
  @Bean
  public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
    return new ThreadPoolTaskScheduler();
  }
  @RequestMapping("/{id}/startCron")
  public String startCron(@PathVariable("id") String id) {
    future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger(DEFAULT_CRON));
    System.out.println("DynamicTask.startCron()"+"------"+id);
    return "startCron";
  }
  @RequestMapping("/{id}/stopCron")
  public String stopCron(@PathVariable("id") String id) {
    if (future != null) {
      future.cancel(true);
    }
    System.out.println("DynamicTask.stopCron()"+"------"+id);
    return "stopCron";
  }
  @RequestMapping("/{id}/changeCron10")
  public String startCron10(@PathVariable("id") String id) {
    stopCron(id);// 先停止,在开启.
    future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("*/10 * * * * *"));
    System.out.println("DynamicTask.startCron10()"+"------"+id);
    return "changeCron10";
  }
  private class MyRunnable implements Runnable {
    @Override
    public void run() {
      System.out.println("DynamicTask.MyRunnable.run()," + new Date());
    }
   }
}

如果想,做成后台管理,添加删除定时任务,可以将定时任务,持久化到数据库,自定义开发MyRunnable定时任务的业务类,也持久化到数据库,然后,threadPoolTaskScheduler.schedule要的业务类,可通过反射实例化出来,传递,然后,通过url,id参数,来开启,关闭,删除,对应的定时任务。

以上这篇java定时任务实现的4种方式小结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java如何实现定时任务

    在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. 一.简介 在java中一个完整定时任务需要由Timer.TimerTask两个类来配合完成. API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行.由TimerTask:Timer 安排为一次执行或重复执行的任务.我们可以这样

  • java Timer 定时每天凌晨1点执行任务

    下面给大家介绍java Timer 定时每天凌晨1点执行任务,具体代码如下所示: import java.util.TimerTask; /** * 执行内容 * @author admin_Hzw * */ public class Task extends TimerTask { public void run() { System.out.println("我有一头小毛驴!"); } } import java.util.Calendar; import java.util.Da

  • Java下SpringBoot创建定时任务详解

    序言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了. 三.基于注解设定多线程定时任务 一.静态:基于注解 基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响. 1.创建定时器 使用SpringBoo

  • Java循环调用多个timer实现定时任务

    通常在使用java实现定时任务时,有两种方法,一种是spring中的schedule(cron = " */5 * * * ?"),另一种就是java中的timer, timer+TimerTask配合实现,这里附上Timer对象的一些常用api Timer() 创建-个新计时器. Timer(boolean isDaemon) 创建一个新计时器, 可以指定其相关的线程作为守护程序运行. Timer(String, name) 创建一个新计时器,其相关的线程具有指定的名称. Timer

  • JAVA使用quartz添加定时任务,并依赖注入对象操作

    最近在写定时任务,以前没接触过.查了些相关资料说使用quartz定时框架. 需要配置文件:config-quartz.xml 相关配置如下(红色部分是之后添加的,在后面步骤会说明): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www

  • Java应用多机器部署解决大量定时任务问题

    今天来说一个Java多机部署下定时任务的处理方案. 需求: 有两台服务器同时部署了同一套代码, 代码中写有spring自带的定时任务,但是每次执行定时任务时只需要一台机器去执行. 当拿到这个需求时我脑子中立马出现了两个简单的解决方案: 利用ip进行判断, 两台机器ip肯定不一样, 指定某一台机器的ip运行. 只在一台机器上部署定时任务的代码. 最后两个方案又都被自己否决了. 第一条,如果指定ip的机器出现了问题怎么办? 例如说宕机了, 那么该制定ip的机器上的定时任务是不是就无法运行了?如果以后

  • java定时任务框架elasticjob详解

    前言 Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.去掉了和dd-job中的监控和ddframe接入规范部分.该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发. ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX. 项目开源地址:https://github.com/dangdangdotcom/elastic-job Elastic-Job是ddframe中d

  • java定时任务实现的4种方式小结

    1. java自带的Timer Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("Time's up!"); } },3*1000,1000); 2.ScheduledThreadPool-线程池 ScheduledExecutorService scheduledThreadPool = Executors.newS

  • Java 异步实现的几种方式小结

    Java 异步实现的几种方式 1. jdk1.8之前的Future jdk并发包里的Future代表了未来的某个结果,当我们向线程池中提交任务的时候会返回该对象,可以通过future获得执行的结果,但是jdk1.8之前的Future有点鸡肋,并不能实现真正的异步,需要阻塞的获取结果,或者不断的轮询. 通常我们希望当线程执行完一些耗时的任务后,能够自动的通知我们结果,很遗憾这在原生jdk1.8之前是不支持的,但是我们可以通过第三方的库实现真正的异步回调. /** * jdk1.8之前的Future

  • Java 实现并发的几种方式小结

    Java实现并发的几种方法 Java程序默认以单线程方式运行. synchronized Java 用过synchronized 关键字来保证一次只有一个线程在执行代码块. public synchronized void code() { // TODO } Volatile Volatile 关键字保证任何线程在读取Volatile修饰的变量的时候,读取的都是这个变量的最新数据. Threads 和 Runnable public class MyRunnable implements Ru

  • java连接zookeeper的3种方式小结

    目录 java连接zookeeper3种方式 1.使用zookeeper原始api 2.使用ZkClient客户端连接,这种连接比较简单 3.使用curator连接 Java集成zookeeper笔记 一.引入zookeeper-3.4.5.jar(原生zk包) 二.手写ZookeeperBase.java java连接zookeeper3种方式 1.使用zookeeper原始api public class Demo { private static String ip = "192.168.

  • Java对象的复制三种方式(小结)

    1.概述 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的.例如下面程序展示的情况: class Student { private int number; public int getNumber() { return number; } public void setNumber(int number)

  • java解析XML几种方式小结

    java解析XML几种方式小结 第一种:DOM. DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作.通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制. DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依

  • java List去掉重复元素的几种方式(小结)

    使用LinkedHashSet删除arraylist中的重复数据(有序) LinkedHashSet是在一个ArrayList删除重复数据的最佳方法.LinkedHashSet在内部完成两件事: 删除重复数据 保持添加到其中的数据的顺序 List<String> words= Arrays.asList("a","b","b","c","c","d"); HashSet<

  • Java 数组转List的四种方式小结

    目录 第一种方式(未必最佳):使用ArrayList.asList(strArray) 第二种方法(支持增删查改): 第三种方式(通过集合工具类Collections.addAll()方法(最高效)) 第四种方式通过JDK8的Stream流将3总基本类型数组转为List java数组转list误区 一.不能把基本数据类型转化为列表 二.asList方法返回的是数组的一个视图 第一种方式(未必最佳):使用ArrayList.asList(strArray) ​ 使用Arrays工具类Arrays.

  • SpringBoot实现定时任务的三种方式小结

    目录 定时任务实现的三种方式 使用Timer 使用Spring Task 1.简单的定时任务 2.多线程执行 SpringBoot三种方式实现定时任务 定时任务实现的三种方式 Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少. ScheduledExecutorService:也jdk自带的一个类:是基于线程池设计的定时任务类,每个调度任

  • JS刷新父窗口的几种方式小结(推荐)

    浮层内嵌iframe及frame集合窗口,刷新父页面的多种方法 <script language=JavaScript> parent.location.reload(); </script> <script language=JavaScript> parent.location.reload(); </script> 弹出子页面 <script language=JavaScript> window.opener.location.reloa

随机推荐