DelayQueue是一個無界的BlockingQueue的實作類,用來放置實作了Delayed介面的對象,其中的物件只能在其到期時才能從佇列中取走。
BlockingQueue即阻塞佇列,java提供的面向多執行緒安全的佇列資料結構,當佇列內元素數量為0的時候,試圖從佇列內取得元素的執行緒將會被阻塞或拋出例外。
這裡的「無界」隊列,是指隊列的元素數量不存在上限,隊列的容量會隨著元素數量的增加而擴容。
DelayQueue實作了BlockingQueue接口,所以具有無界、阻塞的特點,除此之外它自己的核心特點就是:
##“放入該佇列的延時任務對象,只要到達延時時間之後才能被取到”。
DelayQueue 不接收null元素「DelayQueue 只接受那些實作了java.util.concurrent.Delayed介面的物件」
#二、訂單延時任務的實作了解了DelayQueue的特點之後,我們就可以利用它來實現延時任務了,實作java.util.concurrent.Delayed介面。
import org.jetbrains.annotations.NotNull; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; /** * 延时订单任务 */ public class OrderDelayObject implements Delayed { private String name; private long delayTime; //延时时间 //实际业务中这里传订单信息对象,我这里只做demo,所以使用字符串了 private String order; public OrderDelayObject(String name, long delayTime, String order) { this.name = name; //延时时间加上当前时间 this.delayTime = System.currentTimeMillis() + delayTime; this.order = order; } //获取延时任务的倒计时时间 @Override public long getDelay(TimeUnit unit) { long diff = delayTime - System.currentTimeMillis(); return unit.convert(diff, TimeUnit.MILLISECONDS); } //延时任务队列,按照延时时间元素排序,实现Comparable接口 @Override public int compareTo(@NotNull Delayed obj) { return Long.compare(this.delayTime, ((OrderDelayObject) obj).delayTime); } @Override public String toString() { Date date = new Date(delayTime); SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return "\nOrderDelayObject:{" + "name=" + name + ", time=" + sd.format(date) + ", order=" + order + "}"; } }
@Bean("orderDelayQueue") public DelayQueue<OrderDelayObject> orderDelayQueue(){ return new DelayQueue<OrderDelayObject>(); }
@Resource private DelayQueue<OrderDelayObject> orderDelayQueue; //发起订单下单的时候将订单演示对象放入orderDelayQueue orderDelayQueue.add( new OrderDelayObject( "订单延时取消任务", 30 * 60 * 1000, //延时30分钟 "延时任务订单对象信息" ) );
DelayQueue的take方法從佇列中取得延時任務對象,如果佇列元素數量為0,或沒有到達“延時時間的任務”,則該執行緒會被阻塞。
@Component public class DelayObjectConsumer implements InitializingBean { @Resource private DelayQueue<OrderDelayObject> orderDelayQueue; @Override public void afterPropertiesSet() throws Exception { while (true) { OrderDelayObject task = orderDelayQueue.take(); System.out.println(task.toString()); System.out.println(task.getOrder()); //根据order订单信息,去查询该订单的支付信息 //如果用户没有进行支付,将订单从数据库中关闭 //如果订单并发量比较大,这里可以考虑异步或线程池的方式进行处理 } } }
以上是Java DelayQueue怎麼實現延時任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!