`

DelayQueue的应用

 
阅读更多

转:http://ideasforjava.iteye.com/blog/657384

DelayQueue

是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。

 

Delayed

 

一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。

此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。

 

下面的代码模拟一个考试的日子,考试时间为120分钟,30分钟后才可交卷,当时间到了,或学生都交完卷了者考试结束。线程的关闭参考Java编程思想中例子,将exec传给Student的一个内部类,通过他来关闭。

 

Java代码 复制代码 收藏代码
  1. package com.woxiaoe.study.thread;   
  2.   
  3. import java.util.Random;   
  4. import java.util.concurrent.DelayQueue;   
  5. import java.util.concurrent.Delayed;   
  6. import java.util.concurrent.ExecutorService;   
  7. import java.util.concurrent.Executors;   
  8. import java.util.concurrent.TimeUnit;   
  9.   
  10. /**  
  11.  * 模拟考试,时间为120分钟,学生可以再30分钟后交卷,  
  12.  * 当学生都交完了 或 时间到者考试结束  
  13.  * @author 小e  
  14.  *  
  15.  * 2010-4-30 下午11:14:25  
  16.  */  
  17. class Student implements Runnable,Delayed{   
  18.     private String name;   
  19.     private long submitTime;//交卷时间   
  20.     private long workTime;//考试时间   
  21.     public Student() {   
  22.         // TODO Auto-generated constructor stub   
  23.     }   
  24.     public Student(String name, long submitTime) {   
  25.         super();   
  26.         this.name = name;   
  27.         workTime = submitTime;   
  28.         //都转为转为ns   
  29.         this.submitTime = TimeUnit.NANOSECONDS.convert(submitTime, TimeUnit.MILLISECONDS) + System.nanoTime();   
  30.     }   
  31.   
  32.     @Override  
  33.     public void run() {   
  34.         System.out.println(name + " 交卷,用时" + workTime/100 + "分钟");   
  35.     }   
  36.   
  37.     @Override  
  38.     public long getDelay(TimeUnit unit) {   
  39.         return unit.convert(submitTime - System.nanoTime(), unit.NANOSECONDS);   
  40.     }   
  41.   
  42.     @Override  
  43.     public int compareTo(Delayed o) {   
  44.         Student that = (Student) o;   
  45.         return submitTime > that.submitTime?1:(submitTime < that.submitTime ? -1 : 0);   
  46.     }   
  47.     public static class EndExam extends Student{   
  48.         private ExecutorService exec;   
  49.         public EndExam(int submitTime,ExecutorService exec) {   
  50.             super(null,submitTime);   
  51.             this.exec = exec;   
  52.         }   
  53.         @Override  
  54.         public void run() {   
  55.             exec.shutdownNow();   
  56.         }   
  57.     }   
  58.        
  59. }   
  60. class Teacher implements Runnable{   
  61.     private DelayQueue<Student> students;   
  62.     private ExecutorService exec;   
  63.        
  64.     public Teacher(DelayQueue<Student> students,ExecutorService exec) {   
  65.         super();   
  66.         this.students = students;   
  67.         this.exec = exec;   
  68.     }   
  69.   
  70.   
  71.     @Override  
  72.     public void run() {   
  73.         try {   
  74.             System.out.println("考试开始……");   
  75.             while (!Thread.interrupted()) {   
  76.                 students.take().run();   
  77.             }   
  78.             System.out.println("考试结束……");   
  79.         } catch (InterruptedException e) {   
  80.             e.printStackTrace();   
  81.         }   
  82.   
  83.     }   
  84.        
  85. }   
  86. public class Exam {   
  87.     static final int STUDENT_SIZE = 45;   
  88.     public static void main(String[] args) {   
  89.         Random r = new Random();   
  90.         DelayQueue<Student> students = new DelayQueue<Student>();   
  91.         ExecutorService exec = Executors.newCachedThreadPool();   
  92.         for(int i = 0; i < STUDENT_SIZE; i++){   
  93.             students.put(new Student("学生" + ( i + 1), 3000 + r.nextInt(9000)));   
  94.         }   
  95.         students.put(new Student.EndExam(12000,exec));//1200为考试结束时间   
  96.         exec.execute(new Teacher(students, exec));   
  97.            
  98.     }   
  99.   
  100. }  

 Output:

考试开始…… 学生19 交卷,用时35分钟学生16 交卷,用时40分钟学生7 交卷,用时42分钟学生14 交卷,用时52分钟学生15 交卷,用时54分钟学生1 交卷,用时57分钟学生11 交卷,用时62分钟学生2 交卷,用时71分钟学生13 交卷,用时73分钟学生3 交卷,用时78分钟学生20 交卷,用时85分钟学生17 交卷,用时85分钟学生18 交卷,用时90分钟学生6 交卷,用时94分钟学生9 交卷,用时97分钟学生8 交卷,用时102分钟学生12 交卷,用时103分钟学生5 交卷,用时104分钟学生10 交卷,用时108分钟学生4 交卷,用时112分钟考试结束……

分享到:
评论

相关推荐

    DelayQueue延迟队列和Redis缓存实现订单自动取消功能

    在Java编程中,DelayQueue是一种特殊的并发队列,它遵循先进先出(FIFO)原则,但具有一个独特的特性:元素只有在其指定的延迟时间过去之后...同时,这样的设计还具有良好的扩展性,可以应用于其他需要延迟处理的场景。

    DelayQueue、Redis结合使延迟、定时任务使用源代码

    在提供的源代码`RedisDemo`中,可能包含了如何将`DelayQueue`的概念应用于Redis的实际示例。这个示例可能包括了任务的创建、调度、处理以及相关的异常处理逻辑。通过分析和学习这个源代码,你可以更直观地理解如何将...

    JDK自带的延迟队列-DelayQueue

    通过深入理解`DelayQueue`的工作原理和使用方式,我们可以有效地利用它来构建高性能、低延迟的并发应用。在实际项目中,根据需求合理地选择数据结构和并发工具,能显著提升程序的效率和可维护性。

    Java多线程并发开发之DelayQueue使用示例

    DelayQueue的应用场景非常广泛,例如: 1. 任务调度:DelayQueue可以用于实现任务调度系统,按照任务的延迟时间来排序,以便在合适的时刻执行任务。 2. 网络编程:DelayQueue可以用于实现网络编程中的延迟处理,...

    delay-queue:JDK实现的本地delayQueue和基于分布式Redis的两种分布式

    local delayQueue implemented by JDK & two kinds of distributed delayQueue based redis 1. 基本介绍 RedisSynDelayQueue 基于redis,并发情况下会加分布式锁,单线程场景(syn=false)性能较好, 并发场景性能较...

    基于SpringBoot的延迟消息Starter设计源码,支持DelayQueue、Redisson、RabbitMQ三种方式

    该项目是SpringBoot框架下的延迟消息Starter,提供对DelayQueue、Redisson和RabbitMQ三种延迟消息机制的集成支持。项目包含32个文件,涵盖24个Java源文件、4个XML配置文件、1个Git忽略文件、1个Markdown文件、1个...

    Java企业版中性能调节的最佳实践.pdf

    - **应用容器调优**:针对不同的应用服务器(如Tomcat、WebLogic等),调整其配置以优化资源分配、会话管理等。 - **应用架构调优**:优化数据访问层、缓存机制、异步处理等,采用微服务架构可提高系统的可伸缩性...

    java.util.concurrent_您不知道的5件事

    - **应用场景**:在需要限制对某个资源的并发访问数量的情况下,`Semaphore` 非常有用。例如,当连接数据库池时,我们可能希望限制同时打开的连接数,或者在网络爬虫应用中限制并发的HTTP请求数量,以避免服务器过载...

    Delayed interface and Delay Queue

    这篇博文可能是作者Tomboxfan在iteye博客上分享关于这两个概念的深入理解和应用实例。 Delayed接口是Java并发包(java.util.concurrent)中的一个接口,它扩展了Comparable接口,主要用于实现具有延迟特性的对象。...

    Redis深度历险:核心原理和应用实践 全部代码实现

    Redis深度历险:核心原理和应用实践 全部代码实现 1.线程10模型,md 11.RedisDistributeLock.md 12.md 15.Redis主从同步,md 17.Redis Codis.md 18.Redis Cluster.md 19.Redis info.md 2.通信协议.md 3.Redis持久化.md...

    高效的实现队列

    在IT行业中,队列是一种非常...总之,高效地实现队列需要考虑到性能、内存利用率、线程安全等因素,具体实现方式取决于应用场景和需求。通过理解和掌握不同的队列实现,开发者能够更好地优化系统性能,解决实际问题。

    Go-delay-queue基于Redis实现的延迟队列

    在IT行业中,延迟队列是一种特殊的消息队列,它允许我们设定消息在特定时间后才被消费,这对于处理定时...对于希望深入理解延迟队列或者在自己的项目中应用延迟队列的开发者来说,这是一个值得学习和研究的优秀实践。

    Redis深度历险:核心原理和应用实践 全部代码实现.zip

    redis命令实践 1.线程I0樽型,md 11.RedisDistributeLock.md 12.md 15.Redis主从同步,md 17.Redis Codis.md 18,Redis Cluster.md ...6.Redis DelayQueue.md 7.Redis Pubsub 8.RedisStream.md 9.Redis小对象压缩.md

    JAVA并发容器代码随读1

    不同的并发容器根据其设计目的和应用场景,采用不同的实现方式,如 BlockingQueue 的阻塞等待、DelayQueue 的延迟处理、ConcurrentMap 的分段锁、以及 CopyOnWrite 系列的写时复制。理解和掌握这些并发容器的原理和...

    剖析Java中阻塞队列的实现原理及应用场景

    4. **DelayQueue**:基于PriorityQueue,元素需要在指定的延迟时间后才能被获取。它也是无界的,只有在延迟时间到达时,消费者才能取出元素。 阻塞队列和非阻塞队列的主要区别在于处理满队列和空队列的情况。非阻塞...

    高效延时队列的设计与实现

    【高效延时队列的设计与实现】 ...DelayQueue适合轻量级应用,RabbitMQ适合复杂分布式系统,Redis方案简单且灵活,时间轮则在效率和内存使用上表现优秀。选择哪种方案应根据具体业务需求、性能要求以及系统架构来决定。

    java并发编程

    主要介绍java常用并发API,内容有: 基于String构建自己的锁管理器、 Collections构建不可修改的集合对象...DelayQueue实现对象的超时管理、 Lock的应用场景及锁分解机制、 自定义堵塞行为的应用、 非阻塞的同步算法、

    rabbitmq延迟插件.zip

    在IT领域,Spring Boot是一个非常流行的Java开发框架,它简化了构建微服务和Web应用程序的过程。RabbitMQ则是一款开源的消息代理和队列服务器,广泛应用于分布式系统中的异步处理和解耦。当我们需要实现消息的延迟...

    基于Linux的USB摄像头视频采集+编码+发送

    这一技术广泛应用于视频监控、远程教育、在线会议等场景。首先,我们要了解的是基础概念: 1. **Linux与USB摄像头**:Linux操作系统提供了一个名为Video4Linux2(V4L2)的API,用于支持各种视频捕获设备,包括USB...

    Live555 学习笔记

    Live555是一个开源媒体流软件库,广泛应用于实时视频流传输。为了更好地理解和应用Live555,掌握其编译方法至关重要。 - **使用MingW进行编译**: - 在Live555的根目录下,可以通过命令`genMakefilesmingw`来生成...

Global site tag (gtag.js) - Google Analytics