- 浏览: 564258 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (344)
- ··············未分类············· (33)
- Eclipse 插件 (15)
- EDA 工具 (1)
- Linux/Unix (3)
- Java (43)
- Java Applet (1)
- Java Draw2d (22)
- Java Draw2d version2 (6)
- Java GEF (2)
- Java SWT (21)
- Java SWT Image 图像 (21)
- Java SWT Tree (16)
- Java SWT Table (4)
- Java SWT TableViewer (11)
- Java SWTbot (4)
- Java Test (2)
- Java Thread 多线程 (22)
- Java Zest (5)
- RC2_3S400学习笔记 (16)
- tcl 脚本 (10)
- Verilog (7)
- XML (6)
- 国家 (5)
- 感叹 (4)
- 面试题 (9)
- 生活 (36)
- 足球 世界杯 (8)
- 老公看你的 (3)
- web开发 (1)
- 数据结构——图 (7)
- c language (1)
最新评论
-
zxjlwt:
路过素人派http://surenpi.com
SWT 树的事件 SWT.Selection SWT.CHECK SWT.DefaultSelection -
hj01kkk:
1楼用法正解
JDK 7 中的 Fork/Join 模式 -
fish_no7:
使用 new SortTask().fork()
JDK 7 中的 Fork/Join 模式 -
wpf523:
mark
Java 多线程例子6 线程安全 线程同步 同步代码块 同步函数 -
uniquejava:
以前碰到过,估计是在icu包中实现了双击自动选中一段文本的功能 ...
java.lang.NoClassDefFoundError: com/ibm/icu/text/BreakIterator
原文:http://ideasforjava.iteye.com/blog/657384
DelayQueue
是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。
Delayed
一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。
此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。
下面的代码模拟一个考试的日子,考试时间为120分钟,30分钟后才可交卷,当时间到了,或学生都交完卷了者考试结束。线程的关闭参考Java编程思想中例子,将exec传给Student的一个内部类,通过他来关闭。
/** * 模拟考试,时间为120分钟,学生可以再30分钟后交卷, * 当学生都交完了 或 时间到者考试结束 */ class Student implements Runnable,Delayed{ private String name; private long submitTime;//交卷时间 private long workTime;//考试时间 public Student(String name, long submitTime) { this.name = name; workTime = submitTime; //都转为转为ns this.submitTime = TimeUnit.NANOSECONDS.convert(submitTime, TimeUnit.MILLISECONDS) + System.nanoTime(); } public void run() { System.out.println(name + " 交卷,用时" + workTime/100 + "分钟"); } public long getDelay(TimeUnit unit) { return unit.convert(submitTime - System.nanoTime(), TimeUnit.NANOSECONDS); } 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; } public void run() { exec.shutdownNow(); } } } class Teacher implements Runnable{ private DelayQueue<Student> students; public Teacher(DelayQueue<Student> students) { this.students = students; } 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, 3000 + r.nextInt(9000))); } students.put(new Student.EndExam(12000,exec));//1200为考试结束时间 exec.execute(new Teacher(students)); } }
结果 写道
考试开始……
学生39 交卷,用时30分钟
学生22 交卷,用时31分钟
学生28 交卷,用时32分钟
学生40 交卷,用时34分钟
学生44 交卷,用时40分钟
学生9 交卷,用时40分钟
学生42 交卷,用时41分钟
学生25 交卷,用时44分钟
学生8 交卷,用时46分钟
学生21 交卷,用时47分钟
学生5 交卷,用时54分钟
学生10 交卷,用时55分钟
学生31 交卷,用时55分钟
学生7 交卷,用时58分钟
学生29 交卷,用时67分钟
学生37 交卷,用时69分钟
学生6 交卷,用时70分钟
学生32 交卷,用时70分钟
学生24 交卷,用时71分钟
学生30 交卷,用时74分钟
学生16 交卷,用时75分钟
学生2 交卷,用时75分钟
学生35 交卷,用时76分钟
学生34 交卷,用时80分钟
学生19 交卷,用时80分钟
学生45 交卷,用时83分钟
学生33 交卷,用时85分钟
学生13 交卷,用时86分钟
学生15 交卷,用时86分钟
学生11 交卷,用时86分钟
学生41 交卷,用时90分钟
学生38 交卷,用时91分钟
学生43 交卷,用时92分钟
学生20 交卷,用时94分钟
学生27 交卷,用时98分钟
学生36 交卷,用时99分钟
学生14 交卷,用时101分钟
学生12 交卷,用时102分钟
学生23 交卷,用时103分钟
学生17 交卷,用时105分钟
学生3 交卷,用时107分钟
学生26 交卷,用时108分钟
学生18 交卷,用时110分钟
学生1 交卷,用时114分钟
学生4 交卷,用时119分钟
考试结束……
学生39 交卷,用时30分钟
学生22 交卷,用时31分钟
学生28 交卷,用时32分钟
学生40 交卷,用时34分钟
学生44 交卷,用时40分钟
学生9 交卷,用时40分钟
学生42 交卷,用时41分钟
学生25 交卷,用时44分钟
学生8 交卷,用时46分钟
学生21 交卷,用时47分钟
学生5 交卷,用时54分钟
学生10 交卷,用时55分钟
学生31 交卷,用时55分钟
学生7 交卷,用时58分钟
学生29 交卷,用时67分钟
学生37 交卷,用时69分钟
学生6 交卷,用时70分钟
学生32 交卷,用时70分钟
学生24 交卷,用时71分钟
学生30 交卷,用时74分钟
学生16 交卷,用时75分钟
学生2 交卷,用时75分钟
学生35 交卷,用时76分钟
学生34 交卷,用时80分钟
学生19 交卷,用时80分钟
学生45 交卷,用时83分钟
学生33 交卷,用时85分钟
学生13 交卷,用时86分钟
学生15 交卷,用时86分钟
学生11 交卷,用时86分钟
学生41 交卷,用时90分钟
学生38 交卷,用时91分钟
学生43 交卷,用时92分钟
学生20 交卷,用时94分钟
学生27 交卷,用时98分钟
学生36 交卷,用时99分钟
学生14 交卷,用时101分钟
学生12 交卷,用时102分钟
学生23 交卷,用时103分钟
学生17 交卷,用时105分钟
学生3 交卷,用时107分钟
学生26 交卷,用时108分钟
学生18 交卷,用时110分钟
学生1 交卷,用时114分钟
学生4 交卷,用时119分钟
考试结束……
DelayQueue中存放了一些实现了Delayed的有序对象,其中的对象按照事情先后取走(students.take().)。
发表评论
-
多线程的Wait返回它等待的下方
2014-08-15 14:16 556多线程的Wait返回它等待的下方。 Java Code ... -
多线程构造函数
2014-04-04 11:50 2089http://hi.baidu.com/tengxiaofe ... -
关于volatile
2013-01-28 13:24 606Volatile修饰的成员变量在每次被线程访问时,都强迫从共享 ... -
Java 多线程例子10 线程之间通信 wait notify notifyAll
2010-07-26 11:24 1313回答问题:http://www.iteye.com/probl ... -
java Thread 停止 开始 暂停
2010-07-23 15:07 241671,写了一个小程序: public class TestTh ... -
【转载】java Timer TimerTask
2010-07-22 11:31 18191,Timer Timer的实质上就是一个多线程,从它的类中 ... -
多线程 CyclicBarrier
2010-07-20 19:38 964原文:http://blog.csdn.net/qian_34 ... -
java多线程 Semaphore CountDownLatch ScheduledExecutorService
2010-07-20 17:06 1841参考:http://www.ibm.com/developer ... -
java多线程 BlockingQueue 和 SynchronousQueues
2010-07-20 15:30 1463参考:http://www.ibm.com/developer ... -
利用多核CPU计算大的列表中的整数和 CyclicBarrier CountDownLatch ExecutorService
2010-07-20 14:12 1313原文:http://flysnow.iteye.c ... -
JDK 7 中的 Fork/Join 模式
2010-07-20 10:59 1880参考1:http://www.ibm.com/develope ... -
Java 多线程例子10 控制线程的生命 stop
2010-07-19 21:13 1306在Thread类中stop已经不推荐大家使用了,因为使用sto ... -
Java 多线程例子9 线程之间通信 wait notify notifyAll
2010-07-19 20:07 2857下面参照《Java就业培训教材》写了一个相似的线程之间通信的例 ... -
Java 多线程例子8 线程状态
2010-07-19 17:27 1234原文:http://shihaiyang.iteye.com/ ... -
Java 多线程例子7 线程安全 死锁
2010-07-19 17:07 1522死锁:在多个线程里对多个同步对象具有循环依赖时常会出现死锁。最 ... -
Java 多线程例子6 线程安全 线程同步 同步代码块 同步函数
2010-07-18 18:06 2309线程安全 出现线程安 ... -
Java 多线程例子5 实际例子的讨论
2010-07-18 15:18 10211,网络聊天程序,如QQ。 发送信息和接受信息肯定要连个线程 ... -
Java 多线程例子4 继承Thread 实现Runnable
2010-07-16 19:48 17181,Runnable例子 class ThreadDemo ... -
Java 多线程例子3 联合线程 join()
2010-07-16 17:57 22711,联合线程实际上就是 ... -
Java 多线程例子2 前台线程(用户线程) 后台线程(守护线程 ) setDaemon
2010-07-16 15:16 28841,setDaemon(true)后就是后台线程(守护线程 ) ...
相关推荐
DelayQueue的使用以及注意事项,这里需要由BlockingQueue的基本知识,一般的Queue的使用方法poll(),take(),drainTo()和offer(),put()这些应该懂。
"Java多线程并发开发之DelayQueue使用示例" DelayQueue是Java多线程并发开发中的一种常用的数据结构,它是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象。DelayQueue的主要作用是按照对象的延迟时间...
2. **任务调度**:使用Redis的`ZREVRANGEBYSCORE`命令,定期查询当前时间戳之后但未过期的任务。这些任务可以从`Sorted Set`中移除,并交由工作线程处理。 3. **任务处理**:在工作线程中,从Redis获取任务对象并...
学习视频,可以丰富java知识。能够获得更多的专业技能
5. 为了防止Redis中的订单过期但DelayQueue中仍有未处理的订单,可以使用一个单独的线程或服务定期扫描Redis中的已过期键,确保订单的及时取消。 通过结合DelayQueue和Redis,我们可以在保证高并发性能的同时,实现...
Spring Boot延时任务之DelayQueue的使用详解 DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。它提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。DelayQueue的元素...
- **出队(take)**: 使用`take()`方法从`DelayQueue`中取出元素时,会阻塞直到队列中有元素的延迟时间已过,此时该元素会被移出队列并返回。如果队列为空,`take`操作会一直阻塞,直到有元素可用。 3. **线程安全...
基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...
local delayQueue implemented by JDK & two kinds of distributed delayQueue based redis 1. 基本介绍 RedisSynDelayQueue 基于redis,并发情况下会加分布式锁,单线程场景(syn=false)性能较好, 并发场景性能较...
为了使用 DelayQueue,我们需要首先声明一个 Delayed 的对象,例如,我们可以声明一个 Task 对象, Task 对象实现了 Delayed 接口,用于表示一个具有延迟执行的任务。 ``` public class Task<T extends Runnable> ...
该项目是SpringBoot框架下的延迟消息Starter,提供对DelayQueue、Redisson和RabbitMQ三种延迟消息机制的集成支持。项目包含32个文件,涵盖24个Java源文件、4个XML配置文件、1个Git忽略文件、1个Markdown文件、1个...
- **使用**:`available.acquire();` 和 `available.release();` 分别用于获取和释放许可。如果当前没有可用的许可,调用 `acquire()` 的线程会被阻塞直到有许可被释放。 #### 2. CountDownLatch(计数器倒置锁) ...
- **分析架构与设计**:评估应用是否使用分布式对象(例如EJB)、数据库连接方式、同步或异步调用等。 - **性能术语理解**:了解关键性能指标的含义,比如负载(峰值或平均值)、点击(页面访问或HTTP请求)、响应...
DelayQueue是一个无界的并发队列,它使用Delayed接口的特性来存储和管理元素。这个队列的独特之处在于,元素只有在其延迟时间过去后才会被处理。以下是DelayQueue的一些关键特点: 1. 队列中的元素按照它们的延迟...
延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢? 一、背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节是否都正常...
内部实现上,DelayQueue 使用优先级队列(PriorityQueue)策略,确保总是返回延迟时间最短的元素。Delayed 接口用于表示具有延迟属性的元素,ScheduledFutureTask 就是其一个实现,常用于 ...
在本文中,我们将重点关注 Redis 如何实现简单队列,并通过使用 StackExchange.Redis C# 客户端进行操作。 队列是一种遵循先进先出(FIFO)原则的数据结构,常用于消息传递和任务调度。在 Redis 中,我们可以利用 ...
Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等... ConcurrentLinkedQueue、DelayQueue示例、自定义的线程拒绝策略、自定义线程池(使用有界队列)、自定义线程池(使用无界队列)。。。
重点介绍了ScheduledThreadPoolExecutor的内部工作机制,如何使用DelayQueue来存储等待执行的任务。DelayQueue内部实现了一个基于时间优先级的PriorityQueue,保证任务能按计划时间顺序执行。文档还详细描述了任务...
为了处理满和空的情况,我们可以使用双倍大小的数组,当队列满时进行数组复制,将所有元素移动到新数组中,然后更新队头和队尾的索引。 2. **链表实现**: 链表提供更灵活的动态扩展性,每个节点包含元素值和指向...