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的更多相关文章

  1. Java多线程之新类库中的构件CyclicBarrier

    1.类说明: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 Cycl ...

  2. Java多线程之新类库中的构件CountDownLatch

    使用CountDownLatch类 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); ...

  3. Java多线程之新类库中的构件PriorityBlockingQueue

    package concurrent2; import java.util.ArrayList; import java.util.List; import java.util.Queue; impo ...

  4. java 线程 新类库中的构件 countDownLatch 使用

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  5. Java多线程4:Thread中的静态方法

    一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...

  6. Java多线程3:Thread中start()和run()的区别

    原文:http://www.cnblogs.com/skywang12345/p/3479083.html start() 和 run()的区别说明start():它的作用是启动一个新线程,新线程会执 ...

  7. java多线程2:Thread中的方法

    静态方法: Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程". 为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作.下面 ...

  8. Java多线程_复习(更新中!!)

    java多线程的常见例子 一.相关知识: Java多线程程序设计到的知识: (一)对同一个数量进行操作 (二)对同一个对象进行操作 (三)回调方法使用 (四)线程同步,死锁问题 (五)线程通信 等等 ...

  9. Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

随机推荐

  1. Cycles_per_instruction

    https://en.wikipedia.org/wiki/Cycles_per_instruction

  2. perform-two-phase-commits/

    https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/

  3. Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一)

    以前的项目一直不敢用Machine动画,因为当时立项的时候Machine动画还不成熟,最近项目做得差不多了我能有点时间学习,我就想在研究学习学习Machine.用Machine动画的时候需要创建一个A ...

  4. 使用git提交github代码

    新的项目的提交 touch README.md git init git add README.md git commit -m "first commit" git remote ...

  5. 联想笔记本如何关闭功能键,快捷键,如Fn+F1与F1切换

    在BIOS设置界面,进入 "Configuration" 菜单,查看是否有"Hotkey mode"选项,如果有的话,您由Enable更改为Disable,然后 ...

  6. angular.element方法汇总以及AngularJS 动态添加元素和删除元素

    addClass()-为每个匹配的元素添加指定的样式类名after()-在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点append()-在每个匹配元素里面的末尾处插入参数内容att ...

  7. html之head,base,meta,title

    一个简单的HTML最基本的必须的元素 用于定义文档的头部,是所有头部元素的容器.头部描述了文档的各种属性和信息,绝大多数头部的数据都不会直接显示给读者. 下面这些标签可用在head部分:base,li ...

  8. iOS 下拉刷新和加载更多 (OC\Swift)

    Swift语言出来之后, 可能还没有第三方的下拉刷新和上提加载, 所以自己用UIRefreshControl控件和UITableView实例的tableFooterView(底部视图)属性结合起来写了 ...

  9. jQuery Mobile_简单的爱情故事

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. Struts 1.3(第一例) - Login

    本想跳过直接学Struts 2的,想想,还是先学Struts 1,万一到时去那个公司,人家用的是1,那还是要学,以及了解下1与2的区别在哪里. 上例子,很简单的一个网上login例子,再思考下Stru ...