1、介绍
在spring工程中,可以使用quartz进行定时任务的处理,但是在纯java工程中,可以使用java内部提供的timer和ScheduledThreadPoolExecutor实现。
timer内部的任务,如果有一个任务抛异常,没有被处理,那么整个timer就会推出 而ScheduledThreadPoolExecutor就不会存在这样的问题
2、代码
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* ScheduledThreadPoolExecutor 和 Timer创建定时任务
*
* [@Author](https://my.oschina.net/arthor) liufu
* @CreateTime 2018/5/10 15:28
*/
public class ScheduledThreadPoolExecutorTest {
public static void main(String[] args) {
//timer定时器,如果其中有一个任务出现问题,那么整个timer都会推出
Timer timer = new Timer();
try {
timer.schedule(new TimerTask() {
[@Override](https://my.oschina.net/u/1162528)
public void run() {
System.out.println("timer:我是任务1");
//模拟运行时异常
if (new Random().nextInt(3) == 1) {
int result = 1 / 0;
}
}
}, 1 * 1000, 2 * 1000);
timer.schedule(new TimerTask() {
[@Override](https://my.oschina.net/u/1162528)
public void run() {
System.out.println("timer:我是任务2");
}
}, 1 * 1000, 2 * 1000);
}catch (Exception e){
e.printStackTrace();
}
//特殊的线程池,可定时调度,即使其中一个任务报错,其他任务还可以继续运行
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5);
executor.scheduleAtFixedRate(new Runnable() {
[@Override](https://my.oschina.net/u/1162528)
public void run() {
System.out.println("ScheduledThreadPoolExecutor:我是任务1");
//模拟抛异常
int i = 1 / 0;
}
}, 1, 2, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("ScheduledThreadPoolExecutor:我是任务2");
}
}, 1, 2, TimeUnit.SECONDS);
}
}