- 浏览: 276539 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
CodeLove:
如果包含<,(,)...等特殊字符呢
Python变量名检测 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,只能算是 2、8、10、16 几 ...
java实现的任意进制转换 -
mychaoyue2011:
在本地执行了几遍,结果都是:s2开始休眠s1开始休眠s2休眠结 ...
Java线程学习笔记(四)线程join -
chxiaowu:
不错!
Java版的树 -
TenAclock:
这个例子 做不到“学生都交完” 考试结束,只能做到等到考试时间 ...
Java线程学习笔记(十一) DelayQueue的应用
DelayQueue
是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。
Delayed
一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。
此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。
下面的代码模拟一个考试的日子,考试时间为120分钟,30分钟后才可交卷,当时间到了,或学生都交完卷了者考试结束。线程的关闭参考Java编程思想中例子,将exec传给Student的一个内部类,通过他来关闭。
package com.woxiaoe.study.thread; import java.util.Random; import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * 模拟考试,时间为120分钟,学生可以再30分钟后交卷, * 当学生都交完了 或 时间到者考试结束 * @author 小e * * 2010-4-30 下午11:14:25 */ class Student implements Runnable,Delayed{ private String name; private long submitTime;//交卷时间 private long workTime;//考试时间 public Student() { // TODO Auto-generated constructor stub } public Student(String name, long submitTime) { super(); this.name = name; workTime = submitTime; //都转为转为ns this.submitTime = TimeUnit.NANOSECONDS.convert(submitTime, TimeUnit.MILLISECONDS) + System.nanoTime(); } @Override public void run() { System.out.println(name + " 交卷,用时" + workTime/100 + "分钟"); } @Override public long getDelay(TimeUnit unit) { return unit.convert(submitTime - System.nanoTime(), unit.NANOSECONDS); } @Override public int compareTo(Delayed o) { Student that = (Student) o; return submitTime > that.submitTime?1:(submitTime < that.submitTime ? -1 : 0); } public static class EndExam extends Student{ private ExecutorService exec; public EndExam(int submitTime,ExecutorService exec) { super(null,submitTime); this.exec = exec; } @Override public void run() { exec.shutdownNow(); } } } class Teacher implements Runnable{ private DelayQueue<Student> students; private ExecutorService exec; public Teacher(DelayQueue<Student> students,ExecutorService exec) { super(); this.students = students; this.exec = exec; } @Override public void run() { try { System.out.println("考试开始……"); while (!Thread.interrupted()) { students.take().run(); } System.out.println("考试结束……"); } catch (InterruptedException e) { e.printStackTrace(); } } } public class Exam { static final int STUDENT_SIZE = 45; public static void main(String[] args) { Random r = new Random(); DelayQueue<Student> students = new DelayQueue<Student>(); ExecutorService exec = Executors.newCachedThreadPool(); for(int i = 0; i < STUDENT_SIZE; i++){ students.put(new Student("学生" + ( i + 1), 3000 + r.nextInt(9000))); } students.put(new Student.EndExam(12000,exec));//1200为考试结束时间 exec.execute(new Teacher(students, exec)); } }
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分钟 考试结束……
评论
1 楼
TenAclock
2012-08-21
这个例子 做不到“学生都交完” 考试结束,只能做到等到考试时间结束才能结束线程
其实在主线程中只要加上一个变量就可以做到LZ的 做不到“学生都交完” 考试结束。
修改后的代码如下:
其实在主线程中只要加上一个变量就可以做到LZ的 做不到“学生都交完” 考试结束。
修改后的代码如下:
public class Exam { static final int STUDENT_SIZE = 10; public static void main(String[] args) { Random r = new Random(); DelayQueue<Student> students = new DelayQueue<Student>(); ExecutorService exec = Executors.newCachedThreadPool(); /***用来记录最后一个交卷的学生的考试时间,然后就可以结束考试了*/ long shouldEndTime = 0; for(int i = 0; i < STUDENT_SIZE; i++){ long submitTime = 3000 + r.nextInt(9000); shouldEndTime = shouldEndTime > submitTime ? shouldEndTime:submitTime; students.put(new Student("学生" + i, submitTime)); } /**这一句基本上不用要的,主要是用来确定结束的*/ shouldEndTime = shouldEndTime > 12000 ? 12000:shouldEndTime; students.put(new Student.EndExam((int) shouldEndTime,exec));//1200为考试结束时间 exec.execute(new Teacher(students)); } }
发表评论
-
Consider the following code: What will be printed?
2010-09-24 20:30 940Consider the following code: Wh ... -
Java 基础复习笔记一
2010-06-04 02:03 1109这两天复习java的基础知识,把一些自己认为比较有用的点记录下 ... -
Java 转义字符
2010-06-03 21:21 975\n 回车(\u000a) \t 水平制表符(\u0009) ... -
生产消费者的模拟
2010-05-27 23:16 1630采用Java 多线程技术,设计实现一个符合生产者和消费者问题的 ... -
Java 控制台下显示文件结构
2010-05-27 00:10 3236题目: 编写一个Java ... -
Java得到类目录
2010-05-26 23:22 1158String path = MainTest.class.ge ... -
Java文件压缩
2010-05-23 21:54 1200package com.woxiaoe.study.io ... -
UDP传输图片的尝试
2010-05-22 18:05 9792UDP是不可靠的,发送的数据不一定会到达,且顺序不一定 ... -
【转载】Java String.Format() 方法及参数说明
2010-05-15 22:18 1301JDK1.5中,String类新增了一个很有用的静态方法S ... -
【转载】String.format函数使用方法介绍
2010-05-15 22:17 1168http://edu.codepub.com/2009/111 ... -
Java线程学习笔记(十)CountDownLatch 和CyclicBarrier
2010-04-30 21:04 2786CountDownLatch : 一个同步辅助类,在完成一组 ... -
Java线程学习笔记(九)生产者消费者问题
2010-04-29 22:27 1690用多线程来模拟生产者消费者问题。用到BlockingQueue ... -
Java线程学习笔记(八)线程之间的协作
2010-04-26 23:13 1759wait()与notifyAll() 调用sleep ... -
Java线程学习笔记(七)java中递增不是原子性
2010-04-24 23:00 2893以下为测试代码,通过一个自增函数得到最新的值,玩Set你存,看 ... -
Java线程学习笔记(六)在其他对象上同步
2010-04-24 22:47 1336package com.woxiaoe.study.threa ... -
Java线程学习笔记(五)资源共享问题
2010-04-24 21:04 1249IncreaseClient 中持有一个base,每次调用起i ... -
Java线程学习笔记(四)线程join
2010-04-24 20:06 1261《Java编程思想》的一个例子,如果某个线程在另一个线程t上调 ... -
基于java的图(四) 强连通组件
2010-04-22 21:06 1523有向图中, u可达v不一定意味着v可达u. 相互可达则属于同一 ... -
基于java的图(三) 图的拓扑排序
2010-04-21 16:14 1851相关: 基于java的图的实现 基于java ... -
基于java的图的实现(二) 图的两种遍历
2010-04-20 21:51 2083图的实现见http://www.iteye.com/topic ...
相关推荐
主要为大家详细介绍了Java多线程并发开发之DelayQueue使用示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
java使用DelayQueue延迟队列和Redis缓存实现订单自动取消功能
学习视频,可以丰富java知识。能够获得更多的专业技能
JAVA学习高并发的学习笔记。同步非阻塞式IO:Buffere Channel Selector Concurrent包:Blocking:Queue\Concurrent Hash Map \ExcutorService\lock\原子性 BlockingQueue:ArrayBlockingQueue , DelayQueue , ...
DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 DelayQueue、Redis结合使延迟、定时任务使用 源代码下载
Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等示例,列出一些源码包中包括的内容: volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小...
DelayQueue的使用以及注意事项,这里需要由BlockingQueue的基本知识,一般的Queue的使用方法poll(),take(),drainTo()和offer(),put()这些应该懂。
主要给大家介绍了java利用delayedQueue实现本地的延迟队列的相关资料,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列提供了四种处理方法: 抛出异常...
除了具有很好的并发性的Collections,java.util.concurrent还引入了其他一些预先构建的组件,它们可帮助您调整和执行多线程应用程序中的线程。
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...
local delayQueue implemented by JDK & two kinds of distributed delayQueue based redis 1. 基本介绍 RedisSynDelayQueue 基于redis,并发情况下会加分布式锁,单线程场景(syn=false)性能较好, 并发场景性能较...
延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10...
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Agenda • Methodology and Process • Tools of Load Test • Tuning Components in the Software Stack ...> Java Virtual Machine > Application Container > Application Architecture • Future Performance Trend
基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...
DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。这篇文章主要介绍了springboot执行延时任务-DelayQueue的使用,需要的朋友可以参考下
4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...
数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 SynchronousQueue,阻塞双端队列 BlockingDeque, 链阻塞双端队列 ...
囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue(ArrayBlockingQueue、...