注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

DelayQueue  

2011-11-08 11:12:00|  分类: JAVA集合容器 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
DelayQueue是实现Delayed接口的元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。
 Delayed接口定义了getDelay(TimeUnit unit)方法。
 该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,
 并且 poll 将返回 null。当一个元素的
getDelay(TimeUnit unit) 方法返回一个小于或等于零的值时,则出现期满。
 注意1:它是无界阻塞队列,容量是无限的。
 注意2:它是线程安全的,是阻塞的
 注意3:不允许使用 null 元素。 
 注意4:加入的元素必须实现了Delayed接口。
 public interface Delayed
 extends Comparable<Delayed>

 Delayed是一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。
 此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。 
 注意5:对于put(E o)和offer(E o, long timeout, TimeUnit unit),由于该队列是无界的,所以此方法永远不会阻塞。
 因此参数timeout和unit没意义,会被忽略掉。
 注意6:此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选 方法。 
实例1
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class Test {
 /**
  * @param args
  */

 public static void main(String[] args) {
  BlockingQueue<Task> queue=new DelayQueue();
  // TODO Auto-generated method stub
  for(int i=0;i<10;i++)
   new Thread(new ThreadProducer(queue)).start();
  for(int i=0;i<10;i++)
   new Thread(new ThreadConsumer(queue)).start();
 }
}
class Task implements Delayed
{
 String name;
 long submitTime;
 Task(String taskName,long delayTime)
 {
  name=taskName;
  /*conver the time from MILLISECONDS to NANOSECONDS
   * *
   */

  submitTime=TimeUnit.NANOSECONDS.convert(delayTime, TimeUnit.MILLISECONDS) + System.nanoTime();  
 }
 public long getDelay(TimeUnit unit) 
 {  
          System.out.println("get delay");
         return unit.convert(submitTime - System.nanoTime(), TimeUnit.NANOSECONDS);  
    }  
    public int compareTo(Delayed o) 
    {  
     System.out.println("compareTo");
         Task that = (Task) o;  
         return submitTime > that.submitTime?1:(submitTime < that.submitTime ? -1 : 0);  
    } 
 void doTask()
 {
  System.out.println("do task:"+name);
 }
}
class ThreadProducer implements Runnable
{
 ThreadProducer(BlockingQueue<Task> queue)
 {
  this.queue=queue;
 }
 BlockingQueue<Task> queue;
 static int cnt=0;
 public void run()
 {
  Task task;
  Random random =new Random(System.currentTimeMillis());
  while(true)
  {
   task=new Task(""+(cnt),random.nextInt()&0xFFFF);
   cnt=(cnt+1)&0xFFFFFFFF;
   try{
    queue.put(task);
   Thread.sleep(1);
   }catch(InterruptedException e)
   {
    e.printStackTrace();
   }
  }
 }
}
class ThreadConsumer implements Runnable
{
 ThreadConsumer(BlockingQueue<Task> queue)
 {
  this.queue=queue;
 }
 BlockingQueue<Task> queue;
 public void run()
 {
  Task task;
  while(true)
  {
   try{
    task=queue.take();
    task.doTask();
   Thread.sleep(1);
   }catch(InterruptedException e)
   {
    e.printStackTrace();
   }
  }
 }
}
注意1:关于TimeUnit的知识请参照TimeUnit

注意2:compareTo(Delayed o)这里是用于对元素排序的。
  评论这张
 
阅读(1158)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017