Java定时执行任务

周期与定时任务实现

周期执行任务:

Timer timer = new Timer();

if(strategy.equals(STRATEGE_REPEAT)) {
	
	Class<?> clz = Class.forName(task);
	TimerTask ctr = (TimerTask)clz.newInstance();
	
	timer.schedule(ctr, 0, freq*1000);
}

每日定时执行任务

public final static long PERIOD_DAY = 24 * 60 * 60 * 1000;

Date firstTime 	= null;
Calendar calendar = Calendar.getInstance();  

// hour:min:sec
Scanner scanner = new Scanner("09:01:01");
scanner.useDelimiter(":");

int hour = scanner.nextInt();
int minute = scanner.nextInt();
int second = scanner.nextInt();

// firstTime (today)
calendar.set(Calendar.HOUR_OF_DAY, hour);  
calendar.set(Calendar.MINUTE, minute);  
calendar.set(Calendar.SECOND, second);  
firstTime = calendar.getTime();

Timer timer = new Timer();

if(strategy.equals(STRATEGE_DAILY)){
	Class<?> clz = Class.forName(Global.TASK_PACKAGE_PREFIX + task);
	TimerTask ctr = (TimerTask)clz.newInstance();
	
	timer.schedule(ctr, firstTime, Global.PERIOD_DAY);
}


### Java定时执行任务的方式 #### 使用 `Timer` 实现定时任务 尽管存在更先进的替代方案,在某些简单场景下仍然可以使用 `Timer` 来安排一次性或重复性的任务。然而,由于其局限性和潜在的问题,通常推荐采用更新的技术。 ```java import java.util.Timer; import java.util.TimerTask; public class TimerExample { public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new MyTask(), 0, 5000); // 每隔五秒执行一次任务 } static class MyTask extends TimerTask { @Override public void run() { System.out.println("Timer Task Executed"); } } } ``` 此方式适用于非常基础的需求,但对于复杂的应用程序来说不够健壮[^2]。 #### 利用 `ScheduledExecutorService` 进行高级调度 对于现代应用程序而言,`ScheduledExecutorService` 提供了一个更为强大和灵活的选择。该服务不仅能够处理单次延时任务,还能轻松管理周期性工作负载,并且具备良好的错误恢复能力。 ##### 创建并配置 `ScheduledExecutorService` ```java import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledExecutorServiceExample { private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); public void startPeriodicTasks() { Runnable task = () -> System.out.println("Executing periodic task"); // 设置初始延迟时间为零,之后每隔两秒钟触发一次task scheduler.scheduleAtFixedRate(task, 0, 2, TimeUnit.SECONDS); // 如果希望基于上一个任务完成后的固定时间间隔启动下一个实例,则应考虑使用 scheduleWithFixedDelay 方法代替。 } // 记得适时关闭scheduler以释放资源 public void shutdownScheduler(){ scheduler.shutdown(); } } ``` 上述代码片段展示了如何利用 `scheduleAtFixedRate()` 函数设置每两秒执行一次的任务。值得注意的是,当遇到未捕获的异常时,`ScheduledExecutorService` 不会停止整个进程;相反,它只会中断当前序列中的后续调用[^1]。 另外,如果需要确保每次新任务仅在前一任务完成后才开始计时等待期,则应该选用 `scheduleWithFixedDelay()` 方法[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值