Java多线程之新类库中的构件DelayQueue
DelayQueue
是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。
Delayed
一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。
此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。
package concurrent; 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)); } }
Java多线程之新类库中的构件DelayQueue的更多相关文章
- Java多线程之新类库中的构件CyclicBarrier
1.类说明: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 Cycl ...
- Java多线程之新类库中的构件CountDownLatch
使用CountDownLatch类 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); ...
- Java多线程之新类库中的构件PriorityBlockingQueue
package concurrent2; import java.util.ArrayList; import java.util.List; import java.util.Queue; impo ...
- java 线程 新类库中的构件 countDownLatch 使用
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Java多线程4:Thread中的静态方法
一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...
- Java多线程3:Thread中start()和run()的区别
原文:http://www.cnblogs.com/skywang12345/p/3479083.html start() 和 run()的区别说明start():它的作用是启动一个新线程,新线程会执 ...
- java多线程2:Thread中的方法
静态方法: Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程". 为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作.下面 ...
- Java多线程_复习(更新中!!)
java多线程的常见例子 一.相关知识: Java多线程程序设计到的知识: (一)对同一个数量进行操作 (二)对同一个对象进行操作 (三)回调方法使用 (四)线程同步,死锁问题 (五)线程通信 等等 ...
- Java多线程2:Thread中的实例方法
Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...
随机推荐
- java jfinal + ajaxfileupload.js 上传
功能上传 需求:同时上传多张图片 前端:jquery.ajaxfileupload.js 后端:jfinal upload.htm <html> <body> <div ...
- Lua5.1基本函数库介绍
Lua5.1基本函数库介绍assert (v [, message])功能:相当于C的断言,参数:v:当表达式v为nil或false将触发错误,message:发生错误时返回的信息,默认为" ...
- 视图缩放、移动、旋转--ios
UIView *view=[[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)]; view.backgroundColor=[UICo ...
- 虚拟化之kvm与xen对比
xen XenServer is the leading open source virtualization platform, powered by the Xen Project hypervi ...
- unity,standalone下自定义分辨率不起作用的解法
写一个Editor脚本AddMenu.cs:using UnityEditor; using UnityEngine; public class AddMenu : EditorWindow { [M ...
- 【转】VS2012程序打包部署详解
上篇博客把收费系统的总体设计进行了一遍讲解,讲解的同时掺杂了些有关.NET编译机制的总结.程序编写测试完成后接下来我们要做的是打包部署程序,但VS2012让人心痛的是没有了打包工具.不知道出于什么原因 ...
- javascript 返回数组中不重复的元素
这是实现结构伪类type-of-type的部分代码: <script type="text/javascript"> var ret= ["span" ...
- 在VS2008环境下的C++异常处理
在写DAServer的过程中,一直在重视报文逻辑处理,却没有认认真真地去思考异常处理的问题.曾经我发现我在所有的报文处理函数中均没有考虑报文长度的问题,让我内心不由地捏了一把冷汗.我在新增的故障录波及 ...
- 【jmeter】目录介绍
JMeter也学了一阵子了,对于基本的操作已了解,再回过头来看看Jmeter的目录,本篇是对于它的目录进行一些简单的介绍. JMeter解压之后打开,根目录如下图: 1.bin:可执行文件目录 2.d ...
- github 添加 C# IGNORE
在创建仓库时选择 VisualStudio 即可.