Java 范例 - 定时任务
前言
JDK 有两种定时任务的实现,一种是单线程循环判断,另一种则是线程池。
定时器
java.util 包下有 Timer
类可用来实现定时任务,下面是一个简单的例子:
Date date = new Date(new Date().getTime() + 2000L);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("tigger");
}
}, date);
不过该类有个缺陷就是无法并发执行任务,原因是该类是串行地取出任务执行。
定时执行器
为了解决并发执行任务问题,可以使用 ScheduledExecutorService
接口的实现类。
定时执行器本质上是一个线程池,同样的其也是通过 Executors 的工厂方法来进行创建。
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
定时执行器包含了下面三个方法,通过名字就可以知道方法的大致作用。
ScheduledFuture<?> schedule(Runnable, long, TimeUnit)
ScheduledFuture<?> scheduleAtFixedRate(Runnable, long, long, TimeUnit)
ScheduledFuture<?> scheduleWithFixedDelay(Runnable, long, long, TimeUnit)
这里不做详细的叙述,下面给个例子。
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
executor.scheduleAtFixedRate(new Runnable {
@Override
public void run() {
System.out.println(
"delay 3 seconds, then you will this message per 2 seconds");
}
}, 3, 2, TimeUnit.SECONDS);