Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 904|回复: 0

java DelayQueue的应用

[复制链接]

该用户从未签到

发表于 2011-10-15 18:35:57 | 显示全部楼层 |阅读模式
elayQueue

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



Delayed


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

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



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

考试开始……学生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分钟考试结束
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-22 20:26 , Processed in 0.387826 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表