java 定时任务
时间: 2023-10-29 14:00:18 浏览: 115
Java中有多种方式可以实现定时任务。其中比较常用的两种方式是使用Timer和TimerTask类,以及使用ScheduledThreadPoolExecutor类。
1. 使用Timer和TimerTask类:
Timer和TimerTask是Java中用于定时任务的类。Timer负责设定TimerTask的起始与间隔执行时间,而TimerTask是一个抽象类,需要实现自己的run方法,并通过Timer进行执行。下面是一个示例代码:
```java
import java.time.LocalDateTime;
import java.util.Timer;
import java.util.TimerTask;
public class Schedule {
public static void main(String[] args) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("当前线程:" + Thread.currentThread().getName() + " 当前时间:" + LocalDateTime.now());
}
};
// 在指定延迟0毫秒后开始,随后每2000毫秒间隔执行timerTask
new Timer().schedule(timerTask, 0L, 2000L);
System.out.println("当前线程:" + Thread.currentThread().getName() + " 当前时间:" + LocalDateTime.now());
}
}
```
在上面的示例中,创建了一个TimerTask对象,并实现了run方法来定义定时任务的逻辑。然后通过Timer的schedule方法来指定任务的延迟执行时间和间隔执行时间。
2. 使用ScheduledThreadPoolExecutor类:
Java 5.0引入的java.util.concurrent包中的ScheduledThreadPoolExecutor类可以实现更灵活的定时任务。它是一个线程池,用于以给定的速率或延迟重复执行任务。相比于Timer和TimerTask的组合,ScheduledThreadPoolExecutor允许多个服务线程,并且不需要子类TimerTask(只需实现Runnable接口)。下面是一个示例代码:
```java
import java.time.LocalDateTime;
import java.util.concurrent.*;
public class Schedule {
public static void main(String[] args) {
// 创建一个ScheduledThreadPoolExecutor线程池,心线程数为5
ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(5);
// 创建Runnable打印当前线程和当前时间
Runnable r = () -> System.out.println("当前线程:" + Thread.currentThread().getName() + " 当前时间:" + LocalDateTime.now());
/**
* schedule:只执行一次调度
* scheduleAtFixedRate:一开始就计算间隔时间,如果任务超过间隔时间,那么就直接开始下一个任务
* scheduleWithFixedDelay:任务无论执行多久,都要等待上一轮任务完成之后再间隔指定时间,然后才开始下一个任务
*/
// 在指定1秒延迟后执行r,之后每两秒执行一次
scheduledExecutorService.scheduleAtFixedRate(r, 1, 2, TimeUnit.SECONDS);
}
}
```
在上面的示例中,首先创建了一个ScheduledThreadPoolExecutor线程池,核心线程数为5。然后创建一个Runnable对象,用于定义定时任务的逻辑。最后通过scheduleAtFixedRate方法来指定任务的延迟执行时间和间隔执行时间。
综上所述,Java中可以使用Timer和TimerTask类,以及ScheduledThreadPoolExecutor类来实现定时任务。选择哪种方式取决于具体的需求和场景。
阅读全文