Timer 与 DelayQueue
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 简介 有这样一个业务场景,很多业务需要发邮件,如果失败了要重试,每隔5分钟重试一次,最多12次,如果是12次都失败,就记入数据库。 粗一想,很简单嘛,但是仔细想一想,好像不是那么容易,在想一想,嗯,也不是那么难。还是要亲自试一下,写一下代码才知道有哪些坑。 分析 其实,问题的关键在于时间间隔的处理,是使用定时器,还是队列把时间封装一下。 注意,很容易把这2中情况混在一起了。 下面就来把这两种情况都实现一下。 Timer实现 很多对线程池比较熟悉的朋友可能首先想到的是ScheduledThreadPoolExecutor,但是ScheduledThreadPoolExecutor有一个问题就是没有办法取消。 比如发送到第5次成功了,就需要取消周期任务,避免重复发送,ScheduledThreadPoolExecutor是不好实现的。 所以我们直接使用Timer和TimerTask。 先来一个TimerTask import java.util.TimerTask; public class MailSendTimerTask extends TimerTask { private int exeNum; private String name; public MailSendTimerTask(String