编写定时任务的几种方式

1.Thread.sleep(),让线程休眠挂起,等待一段时间后再执行,可参考如下代码:

		// 提前的业务逻辑 xxx
		try { 
			Thread.sleep(2000); // 睡眠2s
		} catch(Exception e){
			// ...
		}
		// 定时任务的业务逻辑

2.利用java.util包下的Timer和TimerTask, TimeTask抽象类实现了Runnable接口,只需要封装一下TimerTask类,再结合Timer类中schedule(....)方法,即可实现定时任务,可参考如下代码使用:

		new Timer("schedued").schedule(new TimerTask(){
			@Override
			public void run() {
				System.out.println("test Timer Task");
			}
		}, 100, 10000);

3.利用线程池:Executors提供几种创建线程池的方式,当然除了常见的创建固定大小的线程池之外,还有个就是通过ScheduledExecutorService来实现定时任务调度。

借助Executors#newScheduledThreadPool来实现定时任务非常简单,如下所示:

		ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); // 获取线程池
		executorService.scheduleAtFixedRate(new Runnable() {
		    @Override
		    public void run() {
		        System.out.println("task: " + System.currentTimeMillis());
		    }
		}, 100, 100, TimeUnit.MILLISECONDS); // 100ms后,首次执行,然后每个100ms执行一次

实际上和Timer的方法类似

4.借助spring,spring提供了强大的功能,支持注解的配置方式,配置完成后在对应的方法上加上注解即可实现定时任务,但是不得不提一下cron表达式,它是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域都代表一个含义,是spring task的强大功能,常见的cron表达式可参考另一篇博客:定时任务实现(Spring注解),部分功能代码用法如下:

配置文件XML:

业务逻辑:

@Component
public class ScheduleDemo {
    @Scheduled(cron = "0 0 5 * * ?")
    public void checkData() {
        System.out.println(" 校验: " + System.currentTimeMillis());
    }
    @Scheduled(cron = "0 0 6 * * ?")
    public void alarm(){
        System.out.println(" 报警: " + System.currentTimeMillis());
    }
}

5.使用LTS任务调度,LTS主要用于解决分布式任务调度问题,支持实时任务,定时任务和Cron任务。有较好的伸缩性,扩展性。代码也很简单,参考如下:

配置好LTS的环境:

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableLTSScheduling(configLocation = "classpath:/lts.properties")
public class JobConfig {
	@Bean
	public OneOffJobClient oneOffJobClient(){
		
		return new OneOffJobClient();
	}
}

引用提交任务:

    @Scheduled(cron = "0 01 0 1 * ?") //每月的1号0点1分
    @JobRunnerItem(shardValue = "efmt.company.savePositionHistoryRecords")
    public void queryCompanyAssets(){
    	positionDomain.savePositionHistoryRecords();
    }
 使用小建议

不推荐使用 Thread#sleep的方式做定时任务

如指向利用jdk实现定时任务,可以考虑 Timer 和 ScheduledExecutorService

如项目本身就利用到了Spring,可以优先考虑优秀的框架提供的服务,如LTS

本文参考连接:https://my.oschina.net/u/566591/blog/1579950

 

 

 

转载于:https://my.oschina.net/jaffine/blog/1580809

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1 使用java Timer类来实现:通过 Timer 和 TimerTask 来实现定时任务。2. 使用java Quartz来实现:Quartz 是一个完全由 Java 编写的开源定时任务框架。3. 使用Spring 框架的Task定时任务:Spring 框架自带的Task定时任务,可以利用这个特性来实现定时任务。4. 使用Java线程池来实现:可以使用Java线程池来实现定时任务,通过设置线程池中线程的定时执行时间来实现定时任务。 ### 回答2: 以下是几种Java定时任务的实现案例: 1. 使用Timer类:Timer类可用于在指定的时间间隔内调度任务。可以创建一个Timer对象,并使用Timer.schedule()方法在指定的时间间隔内执行任务。 例如: ``` Timer timer = new Timer(); TimerTask task = new TimerTask() { public void run() { // 执行任务逻辑 } }; // 在延迟1000毫秒后,每隔2000毫秒执行一次任务 timer.schedule(task, 1000, 2000); ``` 2. 使用ScheduledExecutorService接口:ScheduledExecutorService是一个高度可用的并发定时任务执行器,可用于按指定的时间间隔执行任务。 例如: ``` ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); Runnable task = new Runnable() { public void run() { // 执行任务逻辑 } }; // 在延迟1000毫秒后,每隔2000毫秒执行一次任务 executor.scheduleAtFixedRate(task, 1000, 2000, TimeUnit.MILLISECONDS); ``` 3. 使用Quartz框架:Quartz是一个功能强大的开源任务调度框架,可以用于执行复杂的定时任务。它提供了灵活的配置选项和强大的调度功能,支持持久性存储和集群部署。 例如: ```java // 创建触发器 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInMilliseconds(2000) .repeatForever()) .build(); // 创建任务 JobDetail job = JobBuilder.newJob(MyJob.class) .withIdentity("job1", "group1") .build(); // 创建调度器 Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); ``` 需要注意的是,以上这些只是Java定时任务的几个常见实现方式,还有其他方式,如使用Spring框架的任务调度功能、使用Quartz的注解方式等。根据项目的具体需求和场景,可以选择合适的定时任务实现方式。 ### 回答3: 以下是几种Java定时任务的实现案例: 1. 使用Java的Timer类:可以通过Timer类来实现简单的定时任务。可以创建一个Timer对象,并使用其schedule()方法来指定任务要运行的时间,并在指定的时间间隔内运行。例如,可以使用Timer类来创建一个每隔一分钟执行一次的任务。 2. 使用Java的ScheduledExecutorService接口:该接口是Java提供的一个更强大的定时任务执行框架。可以通过创建一个ScheduledExecutorService对象,并使用其schedule()或者scheduleAtFixedRate()方法来指定任务的运行时间和间隔。例如,可以使用ScheduledExecutorService来创建一个每隔一分钟执行一次的任务,并在任务执行后延迟一定的时间再次执行。 3. 使用Spring框架的@Scheduled注解:如果你的应用程序是基于Spring框架的,可以使用Spring的@Scheduled注解来实现定时任务。只需在你的任务方法上添加@Scheduled注解,并指定任务的执行时间间隔。Spring会自动创建一个定时任务调度器,定时执行你的任务。 4. 使用Quartz框架:Quartz是一个功能强大的开源任务调度框架,可以用于Java应用程序中的定时任务管理。Quartz提供了丰富的API来定义和调度任务,支持复杂的定时任务配置。使用Quartz,可以创建基于时间表达式的任务,并将其作为独立的模块集成到你的应用程序中。 这些只是一些常见的Java定时任务实现案例,具体实现取决于你的需求和应用程序的架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值